目录
-
- 一、整数在内存中的存储(32位系统)
-
-
- 字节序(32位系统)
-
- 1、小端字节序
- 2、大端字节序
-
- 二、判断当前主机是大端字节序还是小端?(32位系统)
- 三、原码、反码、补码(32位系统)
一、整数在内存中的存储(32位系统)
在vs中我们通过调试器就可以看到内存中的详细情况
进入调试阶段
调试 -->窗口—>内存
四个内存是四个窗口,内存1,2,3,4,都可以进入
现在我们就可以看到a的地址 0x00AFFEEC
int型在内存中是以4个字节为单位存储的,内存中用16进制表示,就可以看到a的值为64(16进制),10进制为100;
字节序(32位系统)
字节序简单来说,就是指超过一个字节的数据类型在在内存中的存储顺序。
研究数字的高位在内存的高地址还是低地址。
1、小端字节序
高位字节数据存放在高地址处、低位数据存放在低地址处。
在这里我们输入一个十六进制数来看看在内存中的展示情况
可以看到44存放的位置在低地址,高位的11存放在了高地址中
2、大端字节序
高位字节数据存放在低地址处、低位数据存放在高地址处。
只不过日常中,大端字节序在PC上并不是很主流
二、判断当前主机是大端字节序还是小端?(32位系统)
int isDuan(int a){
int* p = &a;
char* p2 = (char*)p;
if (*p2 == 0x11){
return 1;//表示大端字节序
}
return 0;//表示小端字节序
}
int main()
{
int a = 0x11223344;
printf("%d\n", isDuan(a));
system("pause");
return 0;
}
三、原码、反码、补码(32位系统)
我们在内存中先观察一个负数在内存中的存储方式
int a = -10;
在内存中我们可以看到在内存的存储的值为 f6 ff ff ff
由于我的计算机时小端字节序,它的值就为ff ff ff f6,我们再用二进制的方式进行表示
1111 1111 1111 1111 1111 1111 1111 0110
我们再来表示-10的原码:
1000 0000 0000 0000 0000 0000 0000 1010
第一位的1表示负数,0表示整数
而在计算机中内存是按照补码的方式进行存储,
反码: 原码取反
那对于刚才的-10的原码取反得到的反码就是
1111 1111 1111 1111 1111 1111 1111 0101
首位置表示正负不进行操作。
补码: 反码+1
对于-10的反码+1我们就得到
1111 1111 1111 1111 1111 1111 1111 0110
对于补码转换成原码转换:
1111 1111 1111 1111 1111 1111 1111 1000–>补码
1000 0000 0000 0000 0000 0000 0000 0111–>反码
1000 0000 0000 0000 0000 0000 0000 1000–>反码+1
可以看到:
原码 ==> 补码 取反+1;
反码 ==> 补码 取反+1;