数据在内存中的存储

整形数据在内存中的存储

整型家族

在C语言中整型包括 char(字符) ,short(短整型),int(整型) ,long(长整型) .其中每一个又分为unsigned(有符号)和signed(无符号)。

注:C语言并没有规定长整型一定要比短整型长, 只是表明长整型至少应该和整型一样长,整型至少和短整型 一样长。单纯的字符类型是有符号还是无符号类型是由机器决定

在介绍整型数据在内存中到底是如何存储的之前,先了解原码,反码和补码的概念。
原码:直接讲一个数根据其正负转化为对应的二进制序列。
反码 :将原码的符号位不变其它位按位取反。
补码:将反码加1得到补码。

注:整型数据在内存中是以原码的形式储存的。无符号数的原码,反码,补码形式相同。

看一个例子:
数据在内存中的存储
看着会发现顺序不同,这其实和存储模式有关。关于存储模式的介绍在这篇博客里面:
https://blog.csdn.net/weixin_43213517/article/details/83628845

虽然明白了数据在内存中是以补码的形式存放的,但这并不是人们最关心的,人们最关心的是从内存中取数,取数其实是存数的反过程。

例:

int main()
{
	char a = 128;
	printf("%u\n", a);
	system("pause");
	return 0;
}

输出:4294967168
为什么会是这样呢?
首先a的补码是 0 1000 0000 ,a只有8位所以只存储 1000 0000,按照%u输出,所以先要整型提升,a是char类型,又因为最高位是1所以其他比特位补1,即11111111 11111111 11111111 10000000,因为按照%u输出,所以不存在补码到原码的转换,只需输出即可所以刚好是
4294967168。
如果这个代码是按照%d输出的呢,结果又会是多少?
因为是按照有符号类型输出,所以存在补码到原码的转换.
补码: 11111111 11111111 11111111 10000000
反码: 11111111 11111111 11111111 01111111
原码: 10000000 00000000 00000000 10000000
答案正是 -128