嘿我试图弄清楚为什么-1 << 4(左)移位是FFF0在浏览和浏览网络后我发现"负"数字有一个符号位,即1.因为只是因为"-1"意味着额外的1位,即(33)位,这是'牛逼可能这就是为什么我们认为-1作为1111 1111 1111 1111 1111 1111 1111 1111
例如 :-
#include<stdio.h>
void main()
{
printf("%x",-1<<4);
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们知道 -
Internal representation of -1 is all 1’s 1111 1111 1111 1111 1111 1111 1111 1111 in an 32 bit compiler.
When we bitwise shift negative number by 4 bits to left least significant 4 bits are filled with 0’s
Format specifier %x prints specified integer value as hexadecimal format
After shifting 1111 1111 1111 1111 1111 1111 1111 0000 = FFFFFFF0 will be printed.
Run Code Online (Sandbox Code Playgroud)
上述来源 http://www.c4learn.com/c-programming/c-bitwise-shift-negative-number/
首先,根据C标准,具有负值的带符号变量的左移结果是未定义的.因此,从严格的语言律师的角度来看,这个问题的答案" 为什么-1 << 4导致XYZ "是" 因为标准没有规定的结果应该是什么. "
但是,您的特定编译器实际上正在做的是左移二进制补码表示 -1,就好像该表示是无符号值一样.由于-1的32位二进制补码表示0xFFFFFFFF(或11111111 11111111 11111111 11111111二进制),因此左移4位的结果为0xFFFFFFF0或11111111 11111111 11111111 11110000.这是存储回(带符号)变量的结果,该值是-16的二进制补码表示.如果要将结果打印为整数(%d),则得到-16.
这是大多数现实编译器将要做的,但不依赖它,因为C标准不需要它.