首页 > 其他分享 >C语言中整形的大小端存储

C语言中整形的大小端存储

时间:2023-09-21 21:32:17浏览次数:31  
标签:小端 00 字节 int 存储 C语言 内存 整形

(C语言中整形的大小端存储)


1.案例引入

众所周知,在IDE Visual studio中,调试后可以在内存窗口中看见程序中一些变量的地址以及值 我们这里将一个16进制数字0x12345678存到内存中

int main()
{
	int a = 0x12345678;
	return 0;
}

按下F10后进入调试,打开内存窗口,找到变量a的地址,发现a中值存储的是:78 56 34 12 在这里插入图片描述 存在内中的顺序好像倒置了,但又没完全倒置 所以这就需要了解内存中大小端存储的知识了。


2.大小端存储

十六进制数字的每一位占0.5字节,所以一个字节是十六进制数字中的两位。 在存储十六进制的数字时,以一字节为单位进行存储,也就是0x12345678会以12,34,56,78的分块形式存储在内存中

所以十六进制数字中这四个字节如何在内存中排序就是一个问题,也就有了大端小端的说法


2.1大端存储

  • 大端存储也被称为大端字节序存储
  • 大端存储就是把一个数据的低位字节的内容放到高地址处,高位字节的内容放到低地址处 在这里插入图片描述

2.2小端存储

  • 小端存储也被称为小端字节序存储
  • 小端存储就是把一个数据的低位字节的内容放到低地址处,高位字节的内容放到高地址处 在这里插入图片描述

所以,可以在内存窗口中看出,visual studio 这个IDE是采用的是小端存储 不同的IDE 会采用不同的存储方法

2.3为什么会有大端小端

这是因为在计算机系统中,我们是以字节为单位的,每个地址单元都对应着一个字节,一个字节为8 bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就导致了大端存储模式和小端存储模式。

3.判断机器的字节序

这里的思想是,如果将1放到内存中,其16进制表示为:0x 00 00 00 01 如果按照大端存储就是: 01 00 00 00 如果按照小端存储就是: 00 00 00 01 假如能够取出内存中的第一个字节,如果为1就是大端存储,如果不是1就是小端存储

#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的地址,在将i的地址强制类型转换成char*,再解引用,就取出了第一个字节


标签:小端,00,字节,int,存储,C语言,内存,整形
From: https://blog.51cto.com/u_16237630/7557318

相关文章

  • C语言-数据结构之顺序表
    #include<stdio.h>#defineN128typedefintdata_type;typedefstruct{ data_typedata[N]; intlast;}sqlist;sqlist*list_create();intlist_show(sqlist*L);intlist_clear(sqlist*L);intlist_destory(sqlist*L);intlist_empty(sqlist*L......
  • 萌新学习C语言记录
    今天在牛客网上写了几道题有一个题是把几个十位数字放到一个集合中一开始用char%c发现只能输出十位数字,个位数字被吞掉了之后又用了int%d发现成功把几个十位数字放到一个集合中这可能就是新手常犯的错误了吧......
  • 【Azure Storage Account Table】询问批量将存储账户中的表嵌入另一个账户中的办法
    问题描述询问批量将存储账户中的表嵌入另一个账户中的办法? 问题解答方式一:使用 AzCopy 使用Azcopy做表格的导入导出,注意您需要使用Azcopy7.3版本来实现对Table的操作,可以选择导出到Blob中,这样导出的数据不会保存在本地,以及该指定支持并发导出。从表存储导出数据: htt......
  • Mysql数据库存储引擎
    1.存储引擎的概念1.1什么是存储引擎MySQL中的数据用各种不下同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎。存储引擎是MySQL将数据存储在文件系统中的存储方式......
  • docker存储路径修改到自定义目录路径
    通过修改Docker配置文件的方式来修改Docker数据存储路径,以减少系统盘的占用空间。具体步骤如下:1、停止Docker服务sudosystemctlstopdocker2、备份当前的Docker数据存储目录/var/lib/dockersudomv/var/lib/docker/var/lib/docker.bak3、创建新的Docker数据存......
  • mysql存储引擎:myisam
    Myisam:1.myisam是MySQL默认的存储引擎。myisam不支持事务,也不支持外键,优点是访问的速度快,对事物完整性没有要求(select,insert为主的应用都可以使用这个引擎来创建表)2.myisam的表支持3种不同的存储格式,分别是静态表(字段都是固定长度,优点存储迅速,容易缓存。缺点:占用的空间通常比动态......
  • PostgreSQL 9.6修改数据存储路径
    说明使用的PostgreSQL版本是9.6版本的。实际项目部署过程中,数据库的数据有时候被要求保留5-10年,甚至更久。随着数据量的增大,磁盘占用空间也会随之增大。当数据库默认的安装路径所在目录的磁盘空间不够大时,可以考虑扩容,或者修改数据库数据存放的路径,将路径指定到一个足够大......
  • C语言-复杂的指针关系
     非法的指针 指针表达式    函数指针函数指针-Sunsin-博客园(cnblogs.com)#include<stdio.h>intmain(){int*a;*a=12;return0;}......
  • 【C语言】指针(二)
    在上一次的博客中我了解到了指针变量、const的作用、指针之间的运算、还有野指针的介绍以及assert断言指针(一)一、数组名的理解见如下代码intarr[10]={1,2,3,4,5,6,7,8,9,10};int*p=&arr[0];这里我们使用&arr[0]的⽅式拿到了数组第⼀个元素的地址,但是其实数组名本来就是地址,......
  • oracle存储过程
    1.基本结构CREATEORREPLACEPROCEDURE存储过程名字(参数1INNUMBER,参数2INNUMBER)IS变量1INTEGER:=0;变量2DATE;BEGINEND存储过程名字2.SELECTINTOSTATEMENT将select查询的结果存入到变量中,可以同时将多个列存储多个变量中,必须有一条记录,否则抛出......