整形即有符号(signed)和无符号(unsigned)定义的char,short,int,long型。
要深度理解整形在内存中的存储首先要弄清“三码”概念,也就是所谓的原码,反码和补码。
1.原码,反码,补码
三种类型是整数在内存中的二进制表示法,均有符号位和数值位两部分组成。
符号位:位于首位占一个位置,用0表示正,1表示负。
数值位:正数:数值位原,反,补相同。
负数:原码 直接将数值按正负翻译为二进制位即可得到
反码 原码符号为不变,其他位按位取反即可。
补码 反码加一即可。
同时对于整形来说:数据存放内存中存放的是补码。
为什么计算机要这样定义原码,反码,补码的储存呢?
那是因为计算机要进行加减法运算需要一个统一的二进制格式,但是对原码不做处理的话,正数和负数相加即如下情况
00000000 00000000 0000000 00000001 (+1)
10000000 00000000 0000000 00000001 (-1)相加得
10000000 00000000 0000000 00000010 (-2)明显不符合正常情况,又为了避免分情况讨论(避免添加额外的硬件电路),计算机大佬们发明了原,反,补码。优点:使计算机对整形的加法减法可以统一处理。
2.了解完这个我们接着了解char,char作为字符型为什么被分类到整形呢?
因为char在内存中的存储是先转换为ASCLL表值在进行存储,因为char在内存中占一个字节,刚好对应ASCLL中256个元素。
有符号型和无符号型:char在C语言中没有明确的规定,(和编译器有关,VS中为无符号型char a=unsigned char a),其他类型都默认为有符号型。
3.大小端介绍:
大小端是一种存储模式,跟计算的硬件有关,不同的计算机存储模式可能不同。
大端模式:指数据的低位(个,十,百,千;低->高)存储在内存的高地址中,而数据的高位,存储在内存的低地址中。
小端模式:指数据的高位(个,十,百,千;低->高)存储在内存的高地址中,而数据的低位,存储在内存的低地址中。
下面给出代码检测电脑大小端模式:
int main() {
int* a=1;
char* p = &a;
if (*p == 1) {
printf("小端");
}
else {
printf("大端");
}
}
谢谢大家看到这里,对大家有帮助,以后我还会分享更多It学习中的小知识。