C 奇怪的移动行为

C 奇怪的移动行为,c,bit-shift,C,Bit Shift,以下一行: printf("%ld\n", ((long) 7 << 63) >> 63)); 为什么会这样 ((长)7>63) ((long) 7 << 63) >> 63) 调用未定义的行为,如我预期的(long)7。我想保留第一位。您正在将值为1的0位移到符号位。当您将其全部向后移位时,符号位被保留,因此1总是向外移位,从而产生一个设置了所有位的值,或-1。这就是为什么像这样移动有符号的值是未定义的行为。printf(“%ld\n”)(

以下一行:

printf("%ld\n", ((long) 7 << 63) >> 63));
为什么会这样

((长)7>63)
((long) 7 << 63) >> 63)

调用未定义的行为,如我预期的
(long)7。我想保留第一位。您正在将值为1的0位移到符号位。当您将其全部向后移位时,符号位被保留,因此1总是向外移位,从而产生一个设置了所有位的值,或
-1
。这就是为什么像这样移动有符号的值是未定义的行为。printf(“%ld\n”)((long)((long)7>63);//仍然给我-1
(long)7哦,对不起,我误解了。现在我明白了,我将使用unsigned long。您要做的是:
printf(“%llu\n,((unsigned long)7>63))
((long) 7 << 63) >> 63)