union一个有趣的应用

今天在读《Linux高性能服务器编程》时看到一个有趣的东西。书中用了一个特别的方法去求字节序。我们知道字节序分为大端和小端,大端就是数据的高位字节存储在内存的低地址处,小段则反之。那么我们怎么知道我们的电脑是大端还是小端呢,这本书告诉我们可以利用union的特性,union里面的变量都是共享内存的,我们只需要将一个比如int类型的数据和一个数组union在一起,赋值那个int数据,然后看看数组的高位和低位分别是什么就知道了。

int main(){
	union{
		short value;
		char union_bytes[sizeof(short)];
	}test;
	test.value=0x0102;
	short a=test.union_bytes[0];
	cout<<a;
	if(test.union_bytes[0]==1&&test.union_bytes[1]==2)cout<<"big endian"<<endl;
	else if(test.union_bytes[0]==2&&test.union_bytes[1]==1)cout<<"little endian"<<endl;
	else cout<<"unknown...";
}

自从知道有大端小端这个东西的时候一直有个疑问,为什么在设计上不进行统一呢。出各种各样的标准统一接口不是计算机行业的人经常做的吗哈哈哈哈哈。我给出的解释方式是或许在不同的设备功能不一样,不同的方式可以更好的适应吧。

well,既然不同了那在进行网络传输中如果不统一就会出大问题的。所以Linux给我们提供了4个函数来完成主机字节序和网络字节序的转换,现在网络字节序通常是大端。

unsigned long int htonl(unsigned long int hostlong);
unsigned short int htons(unsigned short int hostshort);
unsigned long int ntohl(unsigned long int netlong);
unsigned short int ntohs(unsigned short int netshort);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值