当前位置:网站首页>浅谈C语言整型数据的存储
浅谈C语言整型数据的存储
2022-08-10 06:20:00 【宗介@bit】
前言
学习计算机知识不光要会编程写代码,同时对计算机的底层逻辑也要清楚。今天简单介绍下在C语言中整型数据是如何存储的,简单了解一下数据存储过程。
一、整型数据类型以及存储形式
1.整型数据类型有以下几种
char (因为字符可以用ASCII码值来表示,所以char也归入整型)
unsigned char
signed char
short
unsigned short [int]
signed short [int]
int unsigned int
signed int
long
unsigned long [int]
signed long [int]
变量的创建是要在内存中开辟空间的,空间的大小是根据不同的类型而决定的。现在定义一个 int a,那么该整型是怎样在内存空间中存储的呢?
在计算机世界中数据都是以二进制形式存储,一个整型在计算机中如何用二进制表示呢?我们引入原码 补码 反码的概念。
计算机中的整数有三种2进制表示方法,即原码、反码和补码。
三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”。
正整数的原、反、补码都相同,数值位都是其二进制,符号位为0;
负整数的原码符号位不变取反为反码,反码加1即为补码;
负整数的原码数值位就是其绝对值的二进制表示,符号位为1.
数据存放内存中其实存放的是补码。
为什么呢?
在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。
二、数据存储顺序
数据在内存中都是以字节为单位存储的,8个比特位为一个字节。
那么字节存储顺序是怎样的呢?

先定义一个int a =20为例,通过vs2019查询a的地址得到a具体存储形式,为了便于观察,事先将窗口调整为4个字节为一行显示,也就是一个整型。
一个字节是两个16进制位,上述刚好8个16进制位,14转十进制即为20;
从14 00 00 00,可以看出字节中存储的数值位是从低到高的,**即 14是最低的数值,那么由此猜想是不是负整数也是这样排列的呢?
那么我们在定义一个负整数观察一下。

通过vs2019对b取地址观察发现b所对应的十六进制是 f6 ff ff ff
为了便于理解,可以将-10的原码 反码 补码 通通表示出来
于是不难发现负整数也是和正整数是一样的存储方式,字节里存放的数据也是从低位开始的。那么便引出字节大小端的概念
字节大小端介绍
什么大端小端:
大端(存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址;
为什么有大端和小端:
这是因为在计算机系统中,以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。
例如:一个 16bit 的 short 型 x ,在内存中的地址为 0x0010 , x 的值为 0x1122 ,那么 0x11 为高字节, 0x22 为低字节。对于大端模式,就将 0x11 放在低地址中,即 0x0010 中, 0x22 放在高地址中,即 0x0011 中。小端模式,刚好相反。我们常用的 X86 结构是小端模式,而 KEIL C51 则为大端模式。很多的ARM,DSP都为小端模式。有些ARM处理器还可以由硬件来选择是大端模式还是小端模式。
下面介绍一道例题
百度2015年系统工程师笔试题:
请简述大端字节序和小端字节序的概念,设计一个小程序来判断当前机器的字节序。
关于字节大小端的概念就不再做解释了,主要介绍一下如何判断字节序
大致思路
只需检验一个整型在该机器中是如何字节排序的即可知道该机器的字节序
依此我们只需访问该整型的第一个字节,弄清楚它存放的是该整型数值的高位还是数值的低位即可。
因为char是一个字节的大小,所以可以用char类型的指针来访问整型即可
有了大致思路便可以写下如下代码
#include<stdio.h>
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
if(check_sys() == 1)
printf("小端\n");
else
printf("大端\n");
return 0;
}
因为a的补码表示为 00000000 00000000 00000000 00000001
如果小端字节序存储 第一个字节 放的就是 1;
如果大端字节序存储 第一个字节 放的就是 0;
通过函数返回值就可以判断该机器的字节序。
总结
以上便是我对整型存储的简单介绍 ,如有错误欢迎指正,谢谢。
最后附上一道练习题。有兴趣的做一做,猜猜输出结果是什么?下次博客会详解。
#include <stdio.h>
int main()
{
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("a=%d,b=%d,c=%d", a, b, c);
return 0;
}
边栏推荐
猜你喜欢
随机推荐
2022 Henan Mengxin League Game (5): University of Information Engineering K - Matrix Generation
MVCC详解
Qt列表下方增加弹出加载数据提示效果
pthread编程重要知识点
JS中初始化对象为null和空对象的区别
MySQL之InnoDB引擎(六)
Qt绘制椭圆曲线的角度问题(离心角和旋转角)
order by injection and limit injection, and wide byte injection
Excuse me.Oracle CDC connector supports LogMiner and XStream API two ways to capture
高质量WordPress下载站模板5play主题
Sort binary tree code
阿里巴巴(中国)网络技术有限公司、测试开发笔试二面试题(附答案)
修改 QtCreator 配置解决 “无法运行 rc.exe” 问题
vsnprint和snprintf的区别
tqdm高级使用方法(类keras进度条)
神经网络可视化有3D版本了,美到沦陷 已开源
Qt使用私有接口绘制窗口阴影
求职
语法基础(判断语句)
BUUCTF笔记(web)








![[网络安全]实操AWVS靶场复现CSRF漏洞](/img/7f/f08e429e3d8ede03a1c1754e256f99.png)
