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,那就符合小端,反之则大端

输出结果:

相关推荐
王磊鑫5 小时前
C语言小项目——通讯录
c语言·开发语言
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
graceyun7 小时前
C语言初阶牛客网刷题——HJ73 计算日期到天数转换【难度:简单】
c语言·开发语言
涛ing8 小时前
21. C语言 `typedef`:类型重命名
linux·c语言·开发语言·c++·vscode·算法·visual studio
黄金小码农9 小时前
C语言二级 2025/1/20 周一
c语言·开发语言·算法
7yewh12 小时前
嵌入式知识点总结 C/C++ 专题提升(七)-位操作
c语言·c++·stm32·单片机·mcu·物联网·位操作
egoist202312 小时前
数据结构之堆排序
c语言·开发语言·数据结构·算法·学习方法·堆排序·复杂度
Shimir13 小时前
高并发内存池_各层级的框架设计及ThreadCache(线程缓存)申请内存设计
c语言·c++·学习·缓存·哈希算法·项目
T.Ree.15 小时前
C语言_自定义类型(结构体,枚举,联合)
c语言·开发语言
Tanecious.15 小时前
C语言--数据在内存中的存储
c语言·开发语言·算法