C语言中整形数据在内存中的存储

目录

  • 整形家族成员
  • 整形数据在内中的存储
  • 将整形常量存入字符类型

整形家族成员

整形家族的成员包括 int,short,long,long long,char,以及上述类型所对应的无符号类型,可能很多人不理解char为什么是整形家族,实际上各种字符存储在内存中存储的是其对应的ASCII值,所有其存储的也是整形数据。

整形数据在内中的存储

在了解了什么是整形家族后,我们就要探讨这种类型在内存中的存储了,对于一个整数来说,它的二进制序列有原码,反码,补码这三种,而在内存中,存储的是数据的补码,对于一个正整数来说,它的原,反,补均相同,但对于一个负整数而言,它的反码等于原码符号位不变,其他位按位取反,补码等于反码+1(补充:而对于补码来说,我们可以通过先-1,在取反得到原码,而我们也可以通过取反+1从反码到原码)这这里我们看图
C语言中整形数据在内存中的存储_第1张图片
可以看出,内存中存储的是数据的补码,而为什么数据是倒着存的呢?这就要涉及到数据存储的模式了,计算机有两种数据存储模式,大端存储小端存储,存储模式和编译器无关,和硬件有关系,所谓大端存储,就是低位字节序存储在低地址,高位字节序存储在高地址,小端存储就是低位字节序存储在低地址,高位字节序存储在高地址,而我的机器是小端存储,因为f6是低位字节序,它被存储在了低地址,后续的ff都存储在了比f6更高的地址。
那么如何验证机器的大小端呢,我们看一段代码
C语言中整形数据在内存中的存储_第2张图片
这段代码其实很好理解,我写了一个自定义函数Check,改函数帮我检验机器是大端还是小端,函数体内,有一个局部变量i被赋值为了1,我取出i的地址,并且将其强制类型转换为char*类型,并且对其进行接引用,我们直到,i的16进制表示是0x00 00 00 01,如果是小端,则01应该被放在了低地址,那么我对被强转的i解引用访问到一个字节的内容,所得到的值就是1,大端的话,就是0。

将整形常量存入字符类型

我们知道,所谓字符类型,就是一个1个字节的小整形,所以一个有符号字符类型的变量可以存储的数据范围是(-128-127),无符号可存储的数据范围是(0-255),这有个问题,有符号的字符类型最小可以存储-128看起来是不合理的,因为对于一个有符号数来说,最高位是符号位,不是数位,那么字符类型的最小可存储数据应该是-127,但其实不是这样的,当-127再-1时,二进制序列就由11111111变成了10000000,所以特别的,10000000在有符号字符类型中会被当做-128,并且如果遍历一下有符号字符类型的数据范围的话,我们还可以发现一个有趣的现象,如图
C语言中整形数据在内存中的存储_第3张图片
这是一个循环,其实对于任何整形数据类型来说,都有这样类似的循环,因为在一个类型无法存储一个过大的数据时,会发生截断,就会导致一个类似于上图的环的存在,同时我们也要注意,不是一个类型决定了数据,而是你所写下的数据本身就有类型,就决定了你用什么数据类型取存储它, 如果存储到位,那么他就不会发生一些你意想不到的现象,所以我们还是要选择合适的数据类型去存储数据。

你可能感兴趣的:(c语言)