二进制补码二进制形式
在 TC++ 编译器中,5 的二进制表示为 (00000000000000101)。 我知道负数存储为2的补码,因此二进制中的-5是(111111111111011)。 最高有效位(符号位)为 1,表示它是负数。
那么编译器怎么知道它是-5呢? 如果我们将上面给出的二进制值(1111111111111011)解释为无符号数,结果会完全不同吗?
另外,为什么1的补语是5 -6 (1111111111111010)?
In a TC++ compiler, the binary representation of 5 is (00000000000000101).
I know that negative numbers are stored as 2's complement, thus -5 in binary is (111111111111011). The most significant bit (sign bit) is 1 which tells that it is a negative number.
So how does the compiler know that it is -5? If we interpret the binary value given above (111111111111011) as an unsigned number, it will turn out completely different?
Also, why is the 1's compliment of 5 -6 (1111111111111010)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
发布评论
评论(8)
让我们举个例子:
我们在二进制的两个字节中有两个数字:
A = 10010111
B=00100110
(注意,机器在这个级别不知道有符号或无符号的概念)
现在当你说“添加”这两个时,机器会做什么? 它只是添加:
R = 10111101(并进位:1)
现在,我们作为编译器需要解释该操作。 我们有两个选择:数字可以有符号或无符号。
1-无符号情况:在c中,数字的类型为“unsigned char”,值为151和38,结果为189。这很简单。
2 - 带符号的情况:我们编译器根据最高有效位解释数字,第一个数字是 -105,第二个数字仍然是 38。所以 -105 + 38 = -67。 但 -67 是 10111101。但这就是我们在结果 (R) 中已经得到的! 结果是相同的,唯一的区别是编译器如何解释它。
结论是,无论我们如何考虑数字,机器对数字执行相同的操作。 但编译器会依次解释结果。
请注意,机器并不知道 2 的补码的概念。 它只是将两个数字相加,而不关心内容。 然后,编译器查看符号位并做出决定。
说到减法,这一次的操作也是独一无二的:取第二个数字的 2 补码,然后将两者相加。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
编译器不知道。 如果将
-5
转换为unsigned int
,您将得到32763
。The compiler doesn't know. If you cast
-5
tounsigned int
you'll get32763
.