C语言 之 整数在内存中的存储、大小端字节序和字节序的判断

文章目录

整数在内存中的存储

整数的2进制表示方法有三种,即 原码、反码和补码

三种表示方法均有符号位和数值位两部分,符号位用0表示"正",用1表示"负",而数值位最

高位的⼀位是被当做符号位,剩余的都是数值位。

正整数的原、反、补码都相同。

负整数的三种表示方法各不相同。

原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。

反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。

补码:反码+1就得到补码。

对于整形来说:数据存放内存中存放的是补码。

大小端字节序和字节序判断

例子:

复制代码
#include <stdio.h>
int main()
{
	int a = 0x11223344;

	return 0;
}

在这个例子中 int a = 0x11223344; 其中0x的意思是将11223344 以16进制的形式存储,我们前面也提到过,16进制的1个位需要2进制的4个位来表示 ,比如16进制f表示15,那么2进制表示15就是1111,我们又知道这个a是整形,大小为4个字节,1个字节等于8个位,那么2个16进制位就刚好占用一个字节

通过调试的内存窗口,我们可以看到在a中的 0x11223344 这个数字是按照字节为单位,倒着存储的。这就是大小端的不同

大小端

其实超过⼀个字节的数据在内存中存储的时候,就会有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下面是具体的概念:

⼤端(存储)模式:是指数据的低位字节内容 保存在内存的高地址 处,而数据的高位字节内容 ,保存在内存的低地址 处。

小端(存储)模式:是指数据的低位字节内容 保存在内存的低地址 处,而数据的高位字节内容 ,保存在内存的高地址处。

有大小端的原因

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着⼀个字节,⼀个字节为8

bit 位,但是在C语言中除了8 bit 的 char 之外,还有16 bit 的 short 型,32 bit 的 long 型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于⼀个字节,那么必然存在着⼀个如何将多个字节安排的问题 。因此就导致了⼤端存储模式和小端存

储模式。

知道是大小端之后,在像我们例子中的情况我们就可以知道内存中下一个地址单元所对应的内容

高位和地位怎么区分?

其实高位和地位的区分就类似于我们的阿拉伯数字,例如数字123,3是个位,2是十位,1是百位,那么3就是低位,所以类似的,0x11223344中,44就是低位了

图例

判断机器大端还是小端的例题

复制代码
#include <stdio.h>
int check_sys()
{
 int i = 1;
 return (*(char *)&i);
}
int main()
{
 int ret = check_sys();
 if(ret == 1)
 {
 printf("小端\n");
 }
 else
 {
 printf("大端\n");
 }
 return 0;
}

解析: 因为我们知道i为整形,大小为4个字节,而整形在空间中是使用二进制的方式进行存储的,return (*(char *)&i);之所以要将i强转为char* 类型,就是因为char* 只能读取一个字节大小的空间,i在内存空间中,肯定是一端为0,一端为1,i的二进制的形式那就是最右端为1,即1为低位,当使用char*去读取这个i的内存空间时,访问的是低地址位置,若解引用得到的值是1,那就符合小端,反之则大端

输出结果:

相关推荐
殷色玫瑰15 分钟前
C++ STL:map 与 set 详解——从底层红黑树到实际应用
c语言·数据结构·c++·算法·visualstudio·rpc
LONGZETECH2 小时前
新能源技术实训难题破解:纯电动汽车五大核心系统三维仿真解决方案
大数据·c语言·人工智能·安全·汽车
知识分享小能手3 小时前
C学习教程,从入门到精通,C语言输入和输出(4)
c语言·开发语言·学习
沐晓时光14 小时前
C语言入门,深入理解指针(3)
c语言·开发语言
SuperByteMaster15 小时前
wfi进入之前没有清除basepri, 导致中断优先级不够,wfi 退不出来
c语言
Navigator_Z16 小时前
LeetCode //C - 1286. Iterator for Combination
c语言·算法·leetcode
奋斗的阿狸_198618 小时前
ESP32-S3 + ES7210 四通道麦克风录音上传方案
c语言·开发语言·fpga开发
2401_8628808219 小时前
iMX6ULL 驱动工程搭建 + LED 灯驱动
c语言·驱动开发·嵌入式硬件
ACP广源盛1392462567319 小时前
Type‑C 扩展坞方案选型笔记|国产 DP1.4 转 HDMI2.0 桥接芯片 GSV2201S @ACP评估
c语言·开发语言·笔记·硬件架构·硬件工程·国产芯片
沐欣工作室_lvyiyi19 小时前
超市智能货架系统设计与实现(论文+源码)
c语言·单片机·课程设计·电子信息工程毕业设计·黑龙江工商学院·广州工商学院·成都工业学院