重新审视大端和小端

本文详细解释了大端和小端存储方式的历史由来及技术原理,并通过示例直观展示了这两种字节序的区别。此外,还提供了一段用于检测计算机系统采用何种字节序的C语言代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前汇编课上讲过,但是我发现还不够。。。下面全面介绍了大端和小端。

大端和小端的历史:

一般吃鸡蛋都是打破鸡蛋大的一端再吃,但是有一次,一个国家的国王打鸡蛋时把手指弄破了,后来,他下令:以后打鸡蛋都从小端开始打。

为了讽刺这件事,就有了大端和小端的概念。

如果一个对象跨越多字节连续存储,则最小的地址就是对象的地址。

比如一个int,在32位和64位机器中都是4字节,如果对象地址为0x100,则整个int占据0x100,0x101,0x102,0x103.

我们都知道&符号,假如int x; &x就为x的地址,即0x100.

[31,30,29,.....1,0]为有效位数,最高有效位为31,最低有效位为0。

小端法:最低有效位存在最前面。

0x100 0x101

---------------------------------------------------------------------------------------------------

| 7,6,5,4,3,2,1,0 |15,14,13,12,11,10,9,8 | ....

----------------------------------------------------------------------------------------------------

大端法:最高有效位存在最前面。

0x100 0x101

---------------------------------------------------------------------------------------------------

|31,30,29,28,27,26,25,24| 23,22,21,20,19,18,17,16| ....

----------------------------------------------------------------------------------------------------

这两张图的对比就很明显的看出区别,就比如int x=2; 转换为16进制为0x00 00 00 02;

小端的存放顺序为:

0x100 0x101 0x102 0x103

----------------------------------------------------

|02 | 00 | 00 | 00 |

----------------------------------------------------

上面已经说过&x取得的是0x100,一般情况下程序员是看不出字节顺序的区别的。

在linux32中,结果为小端存储。

以下是检测大端小端的代码,

记住*****:我们要检测大端小端,必须要把他转化为unsigned char * ch才可以。因为这个ch[i]是一个字节。

--------------------------------------------------------------------------------------------------------------------

#include<stdio.h> typedef unsigned char *byte_pointer; void show_bytes(byte_pointer start,int len) { int i; for(i=0;i<len;i++) printf(" %.2x",start[i]); printf("/n"); } void show_int(int x) { show_bytes((byte_pointer)&x,sizeof(int)); } void show_float(float x) { show_bytes((byte_pointer)&x,sizeof(float)); } void test() { int val=0x87654321; byte_pointer valp=(byte_pointer)&val; show_bytes(valp,4); printf("/n"); int val1=3510593; float val2=3510593.0; show_int(val1); show_float(val2); } int main() { test(); return 0; }

int x=0x12345678;

unsigned char *val=(unsigned char *)&x; //x的地址。

val[0] 为val的地址只指向的字节。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值