今天我调试时使用gdb。我发现了一件很奇怪的事:

print 0xC0 //192, correct
print (char)0xC0 //-64

计算机不是用2的补码来表示负数吗(显然不是这样)或者我从根本上漏掉了一些东西?

最佳答案

不,这肯定是使用了two的补码,您的char转换(在这个实现中,char显然是有符号的)给了您-64的事实就是证明。
我认为您可能只是误解了gdb对输入值0xc0所做的操作。最有可能的情况是将其加载到大于8位的数据类型中,而不假定它必须对扩展8位值进行符号处理。
因此,当您打印0xc0时,它被视为类似于0x000000c0的内容,在two的补码中是一个非常正数。当您显式声明它应该被视为[signed] char时,它会打印负变量。

关于c - linux上的gdb不使用2的补码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45646626/

10-11 06:17