见下面的代码,
signed int a = 136;
unsigned int b = -120;
unsigned sum = a + b;
printf("%d ", sum);
输出 - 16
根据我的知识,
的十六进制表示
136 - ox88
-120 - ox88
1)它应该打印0.不是吗?
2)-ve(有符号)数如何在内存中表示为unsigned int?是这样的,
-120 = 0xffffff88
136 = 0x00000088
如果是,则在unsigned int范围内可能具有等于“0xffffff88”的值,那么它是否会相互冲突?
任何人都可以通过示例解释这个概念吗?(有符号和无符号表示)
答案 0 :(得分:2)
没有必要猜测事物在内存中是如何表示的,2的补码算法是与字节序无关的。
考虑以下计划。
#include <stdio.h>
int main(){
signed int a = 136;
unsigned int b = -120;
unsigned sum = a + b;
printf("a = 0x%x b = 0x%x sum = 0x%x\n", a,b, sum);
}
输出:
a = 0x88 b = 0xffffff88 sum = 0x10
在2的补码中,当我们可以在二进制中求a
和b
而不用担心符号。
当我们手工完成总和时,我们将获得a + b = 0x100000010
。自从第一个1
溢出后,它就会被删除,只留下0x10
,即16
。
答案 1 :(得分:0)
你的第二个二进制表示是正确的。 将这2个二进制数加在一起,你将获得十六进制的0x10或十进制的16(以及一个溢出)
无符号整数中的-120将在4字节无符号整数中具有值4 294 967 176
答案 2 :(得分:0)
0xffffff88 +
0x00000088
----------
0x00000010 => 16
结果前面的1也被丢弃。
结果中倒数第二个位置的1来自于携带,加上8 + 8。