C 有人能解释这个答案是如何计算的吗? #包括 int main() { printf(“%x”,-1
在我看来,这个答案只是您的32位编译器(隐式地)将有符号整数的C 有人能解释这个答案是如何计算的吗? #包括 int main() { printf(“%x”,-1,c,C,在我看来,这个答案只是您的32位编译器(隐式地)将有符号整数的-1转换为long int,而16位编译器将1转换为“好的旧int16位整数 糟糕的答案。吉勒的“停止作恶”在上面给出了一个更好的答案。我只是编辑了这个,所以它不是绝对没有意义的 如上所述,-1是一个有符号整数,左移(请参阅)负的有符号整数会导致未定义的行为,因为符号位无处可去。在我工作过的所有系统中,这种行为都是溢出 16位和32位编译器的结果不同的原因可能是16位编译器使用16位整数,因此16位结果fffe。我附上了一些代码供您试
-1
转换为long int
,而16位编译器将1
转换为“好的旧int
16位整数
糟糕的答案。吉勒的“停止作恶”在上面给出了一个更好的答案。我只是编辑了这个,所以它不是绝对没有意义的
如上所述,-1
是一个有符号整数,左移(请参阅)负的有符号整数会导致未定义的行为,因为符号位无处可去。在我工作过的所有系统中,这种行为都是溢出
16位和32位编译器的结果不同的原因可能是16位编译器使用16位整数,因此16位结果fffe
。我附上了一些代码供您试用,它会很有用
附脏测试
#include<stdio.h>
int main()
{
printf("%x", -1<<1);
getchar();
return 0;
}
/*dirty\u test.c
*该程序将一个有符号整数左移位,然后
*将结果的字节内容打印到标准输出。
*
*在*nix类系统上,使用
*
*cc dirty_test.c-o dirty_test.x
*/
#包括
内部主(空)
{
INTA;
//赋值为负值会导致位移位
//溢出产生溢出。
a=-1;
printf(“移位前字节:%08x\n”,a);
printf(“移位后的字节:%08x\n”,a-1
是一个有符号整数。根据C语言的形式定义,带负数的有符号整数上的左移位是有符号的。这是有符号操作溢出时具有未定义行为的一般规则的一部分。有符号位已设置,必须移位,但没有空间移动,因此无法移动流动
实际上,几乎所有平台都使用有符号整数的表示,有符号整数的左移位被视为内存中包含无符号整数。但是,请注意,编译器有时会利用这是未定义的行为这一事实,以令人惊讶的方式进行优化
-1
是所有位的1,因此左移位会将最上面的位降下来,并在最下面添加一个0位。结果是二进制的111…1110
。如果无符号int
是16位类型,那就是十六进制的fffe
。如果无符号int
是32位类型,那就是fffffff e
。当该内存被读取为签名为int
,值为-2
指定的%x
需要一个无符号int
作为参数。向类型的有符号版本传递一个参数是可以的:它被转换为无符号值。转换的结果是2^N-2,其中N是无符号int
中的位数:如上所述,如果N=16,0xfffffe
则为0xfffe
f N=32。更好:-1U没有涉及长的
。这对于C编译器来说是不正确的,而且它也不能解释问题中报告的行为。我同意我的答案确实是错误的,令人困惑。我一定很困。我将尝试不再回答写得不好的答案。我编辑的目的是成为一名把你写的东西写得很长(不管怎么说,这也是我一直在想的)。我为写这么愚蠢的事道歉。-佩德罗
/* dirty_test.c
* This program left bit-shifts a signed integer and
* prints the byte content of the result to stdout.
*
* On *nix like systems, compile with
*
* cc dirty_test.c -o dirty_test.x
*/
#include <stdio.h>
int main(void)
{
int a;
// assigning a negative value causes the bit shift
// to produce an overflow.
a = -1;
printf("bytes before shift: %08x\n", a);
printf("bytes after shift: %08x\n", a << 1);
return 0;
}