写一个程序判断当前机器的字节序是大端还是小端

前提知识

我的实验平台是x86_64的Ubuntu

本文涉及到计算机字节的大小端表示

大小端

假设有一个int变量的值是0x01000002,它在内存中的起始位置是0x00000000
我们称0x01000002,右边是低位,左边是高位

那么大端字节序的存储结构是这样的,上面一行是地址,下面一行是值

小端字节序的存储结构是这样的

0x00000000	0x00000001	0x00000002	0x0000000302					00					00					01

也就是,当计算机采用小端字节序的时候,要从高地址(0x00000003)往低地址(0x00000000)读才能读出正确的值0x01000002
而采用大端字节序的时候,要从低地址往高地址读。换而言之,小端存储是,低地址保存的是整数的低位(这里的低位是指02开始,到高位01);大端存储时,低地址存储的是整数的高位。

union

平常用的比较多的结构是C的struct,但是C还有一个结构叫做union,最开始是为了节约内存而设计的结构,当然还有更小的结构叫做Bit Filed,这些类型会在这篇文章详细介绍:https://blog.csdn.net/hhmy77/article/details/104114080

C中union有一个特点,联合(union)变量的所有成员共享同一块存储区/内存,因此联合变量每个时刻里只能保存它的某一个成员的值。就是因为这个特点,union的长度就是它最大变量的长度

解答

我们利用这个特点可以写出以下代码

#include<stdio.h>
int main()
{
	union{
		char c;
		int a;
	}s;
	s.a=0x01000002;
	printf("%X\n",s.c);
}

s的长度是4个字节,也就是最大成员a的长度,这一点可以用sizeof去验证。
然后我们赋值给s.a令它的值是0x010000002,此时union的内存地址中只存有s.a的值,s.c并没有赋值,但是s.c和s.a的起始地址是一样的
我们用printf以16进制的格式输出s.c,这个时候就是s的起始地址的第一个字节的内容,在我的平台上输出结果是2,表示低地址存的是整数值的低位,那么我的平台字节序是小端表示的。

参考资料

https://blog.csdn.net/humanking7/article/details/81057648

https://blog.csdn.net/yebufan/article/details/5793246

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值