计算机是如何存储int类型的
声明:本文的内容适用于大部分的C++编译环境,但是可能在部分环境下输出不同。
在阅读文章之前,请务必了解原码,反码和补码的知识。
原码:第一位表示符号,0正1负,其余位表示二进制数值。
反码:正数的反码和原码相同,负数的反码是除符号位以外全部取反。
补码:正数的补码和原码相同,负数的补码是其反码+1。
补码的作用是为了方便处理负数。
printf函数中有一个参数%x,用于输出十六进制。其中,这个十六进制中包含符号位。因此,我们输出下面的代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=-1;
printf("%x",a);
}
输出:ffffffff
0xffffffff就是二进制的1111111111111111111111111111111个(32个1),为-1的补码。
我们可以把a带入其他数据计算,研究表明,int按照补码存储。
补充:字节排序
#include<bits/stdc++.h>
using namespace std;
int main(){
int a=0x12345678;
char *p=(char*)&a;
for(int i=0;i<4;i++)printf("%x",p[i]);
}
在我的环境输出78563412。因此,int其实按照四个字节,每个字节逆序排放。
部分环境按照12345678正序排放。这种排放方式就是字节排序。