大家好,我来给大家分享一下关于整形变量在内存中的存储:
首先我们来看一下C语言基本内置的数据类型和它们对应的空间大小
char //字符数据类型
short //短整型
int //整形
long //长整型
long long //更长的整形
float //单精度浮点数
double //双精度浮点数
接下来我们就这整形类型来讲讲它在内存中的存储
首先我们要了解两个关键词 signed 和unsigned
signed修饰变量代表该变量有符号
unsigned修饰变量表示该变量无符号
整数在二进制存储时如果该数据是有符号我们将最高位看作符号位
用 1表示负 用 0 表示正。
整数在计算机中以二进制存储有三中方式:原码,反码,补码,其中整数在计算机以补码存入。
正数的原码,反码,补码相同,而负数的原码,反码,补码要经过一定的变换
我们可以从以上两张图中可以看出原码反码补码的关系以及整型在内存中以补码的方式存储但大家发现没为什么a b在内存中是反着存的?
要解决这个问题
我们要了解大小端的概念
为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元
都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short
型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32
位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因
此就导致了大端存储模式和小端存储模式。
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。
大小端是一种数据在内存中的存储模式,而补码是数据存入内存的内容可不能将两者混为一谈,
就像你往钱袋里装钱,你可以按从大到小或从小到大还能随机放入,但不论怎么放,你始终是要把钱都放入钱袋中的。
这里还要主意数据以什么存储模式放入内存的就要以什么模式拿出来。不能你以小端模式存入用大端模式拿出。
我们来看看下面的练习加深下理解
同学们让我们想想输出的是什么?
首先我们先来看看a和b,a赋值为-1以整型方式输出为-1,对于b,我们知道signed 修饰有符号的数据赋值-1 输出-1很正常,但为什么赋值-1但输出却为255呢?
让我们对整型的数据存储进行分析
以上就是全部内容,不足的地方欢迎指出。



