主要内容:本文主要介绍C语言中的整型数据在内存中的存储。
本文需要整型提升部分的知识,若需要可浏览此文:【待补充】
同时,有浮点型数据在内存中存储的详解:浮点型数据在内存中的存储
一、大小端存储
计算机有两种存储方式,大端存储模式和小端存储模式
大端存储模式:数据的低位保存在内存的高地址中,高位保存在内存的低地址中
小端存储模式:数据的低位保存在内存的低地址中,高位保存在内存的高地址中
以数据11223344为例,大端存储和小端存储如下图所示:
我们如何判断自己的计算机使用的是大端存储还是小端存储呢?可以通过下面这段代码进行判断:
#include <stdio.h>
int main(){
int a=1;
char* p=(char*) &a;//取出a所存储的地址的第一个字节
if(*p==1) printf("小端存储");//若第一个字节存储的是01
else printf("大端存储");//若第一个字节存储的是00
return 0;
}
二、整型在内存中的存储
有符号整型在内存中是以补码形式进行存储的,关于无符号整型在内存中的存储有什么需要注意的是有符号整型到无符号整型的转换。此处以例子讲解。
1、例1:-128转换为无符号整数
#include <stdio.h>
int main(){
char a=-128;
printf("%u\n",a);//%u打印十进制无符号数字
return 0;
}
运算过程:
由此可见,整型数据在存储时,要将二进制原码转化为补码存储。在输出时,要将补码转化为原码输出。
2、无符号数的范围
我们都知道,一个有符号字节的表示的范围是-128~127,一个无符号字节的表示的范围是0~255。那么,在使用无符号数和有符号数的时候有什么需要注意的呢?
看以下代码:
#include <stdio.h>
int main(){
unsigned int i;
for(i=9;i>=0;i--) printf("%u\n",i);
return 0;
}
此代码死循环,原因是i为无符号整数,无符号整数永远>=0。以1个字节为例子。数与数之间的关系如下图所示。
可以理解为一个钟表,在时钟上,0点的下一个是1点、1点的下一个是2点… … 11点的下一个是12点、12点的下一个又回到了0点。
以1个字节为例子,0000 0000的下一个是0000 0001 … … 1111 1111的下一个又回到了0000 0000。
上面那段代码,就是一个逆时针转的时钟,9-1=8、8-1=7… …0-1=
(
11111111111111111111111111111111
)
2
(11111111 11111111 11111111 11111111)_{2}
(11111111111111111111111111111111)2… …
3、有符号数的范围
#include <stdio.h>
int main(){
char a[1000];
for(i=0;i<1000;i++) a[i]=-i-1;
printf("%d",strlen(a));
return 0;
}
与无符号数的范围一样的道理,有符号数是从-128~127的一个钟表盘。
a[0]=-1、a[1]=-2、a[2]=-3… …a[127]=-128、a[128]=127、a[129]=126… …a[253]=2、a[254]=1、a[255]=0
0在ASCII码表中对应’\0’,strlen读取到’\0’结束。所以输出结果为255。
本文为个人学习总结所得,如有错误欢迎指正。
你的点赞将为我带来很大的鼓励。