所以,假设我有一个有符号整数(几个例子):
-1101363339 = 10111110 01011010 10000111 01110101 in binary.
-2147463094 = 10000000 00000000 01010000 01001010 in binary.
-20552 = 11111111 11111111 10101111 10111000 in binary.
Run Code Online (Sandbox Code Playgroud)
现在:-1101363339 >> 31例如,应该等于1对吗?但在我的电脑上,我得到-1.无论我选择什么负整数,如果x =负数,x >> 31 = -1.为什么?显然是二进制的,它应该是1.
Jef*_*den 19
每C99 6.5.7按位移位运算符:
如果E1具有带符号类型和负值,则结果值是实现定义的.
其中E1是班次表达式的左侧.所以它取决于你的编译器你会得到什么.
aar*_*man 10
在大多数语言中,当您向右移动时,它会进行算术移位,这意味着它会保留最重要的位.因此,在您的情况下,您有二进制的所有1,十进制为-1.如果您使用,unsigned int您将获得您正在寻找的结果.
Per C 2011 6.5.7按位移位运算符:
结果
E1 >> E2是E1右移位E2位置.如果E1具有无符号类型 或者E1具有有符号类型和非负值,则结果的值是E1/ 2 E2的商的整数部分.如果E1具有有符号类型和负值,则结果值是实现定义的.
基本上,负有符号整数的右移是实现定义的,但大多数实现选择将其作为算术移位.
您所看到的行为称为算术移位,即右移时扩展符号位.这意味着MSB将携带与原始符号位相同的值.换句话说,在左移操作之后,负数总是负的.
请注意,此行为是实现定义的,不能使用其他编译器来保证.