在(00000000000000101).编译器中,5的二进制表示形式为5我知道负数是以2的补码形式存储的,因此二进制的-5是。最重要的位(符号位)是1,这说明它是一个负数。
那么编译器如何知道它是-5呢?如果我们将(111111111111011)上面给出的二进制值解释为一个无符号数字,结果会完全不同吗?
此外,为什么5 -6 (1111111111111010)中的1是恭维词?
发布于 2009-03-17 17:34:31
编译器不知道。如果你把-5投给unsigned int,你就会得到32763。
发布于 2009-03-17 17:35:51
编译器知道,因为这是CPU本机使用的约定。您的计算机有一个CPU,它在两个补码表示法中存储负数,所以编译器也会这样做。如果您的CPU支持一个人的补码表示法,编译器将使用它(顺便说一句,IEEE浮点数就是这样)。
维基百科关于这个主题的文章解释了二补表示法的工作原理。
发布于 2009-03-17 17:36:07
处理器实现有符号指令和无符号指令,这将以不同的方式对二进制数字表示进行操作。编译器根据所涉及的操作数的类型知道这些指令中的哪一条(即int和unsigned int)。
编译器不需要知道数字是否为负数,它只是为所涉及的类型发出正确的机器或中间语言指令。处理器或运行时对这些指令的实现通常也不太关心数字是否为负数,因为两种补码算法的公式对正数或负数都是一样的(事实上,这是两种补码算法的主要优点)。如果一个数字是负数,需要知道的是类似于printf(),正如Andrew指出的,设置的MSBit表示二的补码中有负数。
https://stackoverflow.com/questions/655257
复制相似问题