先了解源码,反码,补码 的概念
-
补码定义:
- 对于一个固定的位数 n,最高位(最左边的位)被称为符号位,用来表示正负数。
- 对于正数,其补码等于其本身的二进制表示。
- 对于负数,其补码等于其二进制表示的反码加 1。
2. 反码 : 源码的符号位不变,其余取反。
如果一个操作数是有符号数,而另一个操作数是无符号数,则有符号数会被隐式转换为无符号数,然后进行相加。
unsigned int a = 5;
int b = -10;
unsigned int result = a + b; // 结果为 4294967291,b 隐式转换为无符号整数进行计算
-10 的源码为 1000 0000 0000 0000 0000 0000 0000 1010 阴影部分为符号位
-10 的反码为 1111 1111 1111 1111 1111 1111 1111 0101 符号位不变,其余取反
-10 的补码为 1111 1111 1111 1111 1111 1111 1111 01110 补码 = 反码 + 1
-10 被转换为无符号整数后的值为 4294967285。
需要注意的是,有符号数和无符号数相加的结果可能会导致溢出,例如当被转换的有符号数的值为负数并且绝对值大于无符号整数的最大值时。在这种情况下,结果将超过无符号整数的范围。因此,在进行这样的计算时,确保了解并适当处理溢出的情况是很重要的。