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

标签 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(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 的补码中,我们可以将 ab 进行二进制求和,而不必担心符号。

当我们手动求和时,我们将得到a + b = 0x100000010。由于第一个 1 溢出,因此它被简单地丢弃,留下 0x10,即 16

关于c - 内存中数据的有符号和无符号表示?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24054503/

相关文章:

c - 在节点中有多个元素的 B 树中递归查找第 k 个最小元素

c++ - 禁止隐式 `unsigned` 到 `double` 转换

objective-c - -2 < 1 = 错误。为什么?

assembly - 二进制补码快速方法

c++ - 在 C/C++ 中管理分层数据

c - 为什么ide显示 "[Error] incompatible type for argument"?

c++ - 在 Android NDK 中使用 C/C++ 加密(Rijndael 密码)

c - 是否保证将 -1 分配给无符号类型会产生最大值?

java - 在java中将负int赋给long

int - 32位有符号整数的最小值是多少?