请参阅下面的代码,
signed int a = 136;
unsigned int b = -120;
unsigned sum = a + b;
printf("%d ", sum);
输出 - 16
据我所知,
十六进制表示
136 - ox88
-120 - ox88
1) 所以它应该打印 0。不是吗?
2) -ve(signed) 数字如何在内存中表示为 unsigned int ?是这样吗
-120 = 0xffffff88
136 = 0x00000088
如果是的话,在unsigned int范围内可能有一个等于“0xffffff88”的值,那么会互相冲突吗?
任何人都可以用示例解释这个概念吗?(有符号和无符号表示)
最佳答案
无需猜测事物在内存中的表示方式,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
。
关于c - 内存中数据的有符号和无符号表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24054503/