内存中数据的有符号和无符号表示?

时间:2014-06-05 07:46:37

标签: c unsigned signed

见下面的代码,

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”的值,那么它是否会相互冲突?

任何人都可以通过示例解释这个概念吗?(有符号和无符号表示)

3 个答案:

答案 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的补码中,当我们可以在二进制中求ab而不用担心符号。

当我们手工完成总和时,我们将获得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。