今天我调试时使用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/