关于有符号整数位的表示,这是一个疑问.例如,当你想表示-1时,它相当于(+1)的2的补码.所以-1表示为0xFFFFFFF.现在,当我将数字移动31并打印结果时,它将返回-1.
signed int a = -1;
printf(("The number is %d ",(a>>31));//this prints as -1
Run Code Online (Sandbox Code Playgroud)
那么有人可以向我解释这些位是如何表示负数的吗?
谢谢.
Nos*_*dna 10
当最高位为零时,该数字为正.当它为1时,数字为负数.
向右移动的负数继续将"1"移位为最高位以保持数字为负.这就是你得到答案的原因.
有关二进制补码的更多信息,请参阅此Stackoverflow问题.
@Stobor指出一些C实现可以将0转换为高位而不是1. [在维基百科中验证.]在Java中,它可靠地是算术移位.
但提问者给出的输出显示他的编译器正在进行算术转换.
C标准不确定负(必然符号)整数的右移是否将零(逻辑右移)或符号位(算术右移)移位到最高有效位.这取决于实施的选择.
因此,可移植代码确保它不会对负数执行右移.它可以在移位之前将值转换为相应的无符号值(保证使用逻辑右移,将零置于空出的位),或者确保值为正,或者它容许输出的变化.
| 归档时间: |
|
| 查看次数: |
10084 次 |
| 最近记录: |