C中的右移位对变量int保持符号,对原始int失去符号,为什么?

watbbzwu  于 2023-02-15  发布在  其他
关注(0)|答案(2)|浏览(94)

我正在尝试寻找一个非零整数a,使得a〉〉31 == 1。我遇到的问题是,任何一个负数的右移都会导致一个负数......除非我对一个原始整数执行移位。例如输出:

int a = -2147483648
a >> 31 = -1
-2147483648 >> 31 = 1

至少,这是我和广发银行混在一起,试图弄清楚发生了什么事时得到的。
我试过其他的输入,比如1,-1,2147483647等等,但是都不起作用。我想我可能误解了整数表示法,但是我不知道是什么,而且很多推荐的帖子要么对我没有意义,要么没有回答我的问题。

2w3kk1z5

2w3kk1z51#

有符号整数的右移由实现定义。
大多数现代编译器将其转换为算术移位:

bvuwiixz

bvuwiixz2#

我现在正试图找到一个非零整数a,使得a〉〉31 == 1。
由于您使用的是 integer 而不是int,因此设置了高位的32位unsigned int将满足此要求。

unsigned int a = 2147483648;
a = a >> 31;
printf("a=%u\n", a);

以上将输出1。

相关问题