int8_t
是一个有符号的 8 位整数类型,通常用于表示范围在 -128 到 127 之间的整数。在计算机内存中,有符号整数通常使用二进制补码表示法来存储。
二进制补码表示法
二进制补码是一种表示有符号整数的方法,它使得加法和减法操作可以统一处理,简化了硬件设计。对于 8 位有符号整数 int8_t
,其二进制补码表示法如下:
- 正数:直接用二进制表示。
- 负数:先将该数的绝对值转换为二进制,然后取反(即每一位取反),最后加 1。
将 -48 转换为二进制补码
-
找到 48 的二进制表示:
- 48 的二进制表示是 0
0110000
。
- 48 的二进制表示是 0
-
取反:
- 取反后得到 1
1001111
。
- 取反后得到 1
-
加 1:
- 加 1 后得到 1
1010000
。
- 加 1 后得到 1
因此,-48 在 8 位有符号整数中的二进制补码表示是 11010000(包括最高位符号位)
。
存储在内存中的形式
在内存中,int8_t
类型的数值 -48 会以二进制补码的形式存储。具体来说,-48 会被存储为以下 8 位二进制数:
11010000
逐位解释
- 最高位 (MSB):1 表示这是一个负数。
- 其余位:
1010000
是 48 的二进制补码表示。
示例代码
以下是一个简单的 C++ 代码示例,展示如何查看 -48 在内存中的二进制表示:
cpp
深色版本
#include <iostream>
#include <bitset>
int main() {
int8_t value = -48;
std::bitset<8> binary(value);
std::cout << "The binary representation of -48 is: " << binary << std::endl;
return 0;
}
运行这段代码,输出将会是:
深色版本
The binary representation of -48 is: 11010000
这验证了 -48 在内存中的二进制补码表示确实是 11010000
。
知道补码如何推导出对应的数值
-48在内存中的补码是11010000,怎么从11010000这个补码推导出-48这个值呢?
1.首先要明确把11010000解析为uint8,还是int8。
2.如果把11010000解析为uint8,那么最高位不是符号位,而是数值位。11010000就是一个正数,正数和0的补码就是
该数(二进制)本身,11010000的值是208。
3.如果把11010000解析为int8,那么最高位是符号位,剩下的7位是数值位,并且是补码的形式。所以把低7位1010000取反加1,或者的值48就是对应数值的绝对值,再看最高位为1,说明是负数,得到-48。
注意:从一个数值推导补码时,如果是负数,是将绝对值的二进制所有的bit位(例如,64个bit)取反加1。而从补码推导数值时,要把最高位的符号位除开后的数值位(例如,0~62bit)取反加1,或得对应数值的绝对值,再拼上最高位的符号位。
总结
- -48 的二进制补码表示:
11010000
。 - 最高位 (MSB):1 表示这是一个负数。
- 其余位:
1010000
是 48 的二进制补码表示。
这种表示方法确保了加法和减法操作的一致性,并且能够有效地利用有限的位数来表示有符号整数。