由于位溢出而表示-1?

Mas*_*Kas 1 c bit

嘿我试图弄清楚为什么-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/

Typ*_*eIA 6

首先,根据C标准,具有负值的带符号变量的左移结果是未定义的.因此,从严格的语言律师的角度来看,这个问题的答案" 为什么-1 << 4导致XYZ "是" 因为标准没有规定的结果应该是什么. "

但是,您的特定编译器实际上正在做的是左移二进制补码表示 -1,就好像该表示是无符号值一样.由于-1的32位二进制补码表示0xFFFFFFFF(或11111111 11111111 11111111 11111111二进制),因此左移4位的结果为0xFFFFFFF011111111 11111111 11111111 11110000.这是存储回(带符号)变量的结果,该值是-16的二进制补码表示.如果要将结果打印为整数(%d),则得到-16.

这是大多数现实编译器将要做的,但不依赖它,因为C标准不需要它.