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语言简单编程练习9
c语言·开发语言·算法·vim
Peter_chq5 小时前
【操作系统】基于环形队列的生产消费模型
linux·c语言·开发语言·c++·后端
hikktn7 小时前
如何在 Rust 中实现内存安全:与 C/C++ 的对比分析
c语言·安全·rust
观音山保我别报错7 小时前
C语言扫雷小游戏
c语言·开发语言·算法
小林熬夜学编程9 小时前
【Linux系统编程】第四十一弹---线程深度解析:从地址空间到多线程实践
linux·c语言·开发语言·c++·算法
墨墨祺9 小时前
嵌入式之C语言(基础篇)
c语言·开发语言
躺不平的理查德10 小时前
数据结构-链表【chapter1】【c语言版】
c语言·开发语言·数据结构·链表·visual studio
幼儿园园霸柒柒11 小时前
第七章: 7.3求一个3*3的整型矩阵对角线元素之和
c语言·c++·算法·矩阵·c#·1024程序员节
好想有猫猫11 小时前
【51单片机】串口通信原理 + 使用
c语言·单片机·嵌入式硬件·51单片机·1024程序员节
摆烂小白敲代码12 小时前
背包九讲——背包问题求方案数
c语言·c++·算法·背包问题·背包问题求方案数