计算机中的字节序问题

时间:2014.02.20

地点:基地

——————————————————————————————

一、问题的提出

  程序设计中的数据类型有很多事跨多个字节的,比如char是用一个字节表示,而诸如int,float类型则用4个字节表示double则用8个字节表示,我们知道,数据对象实例是存储在一定地址单元中的,我们也知道,存储器中的每个字节都由一个唯一的地址标志或者是存储。那么当数据对象跨多个字节时,各字节时如何安排存储的呢?这就是字节序的问题。

——————————————————————————————

二、问题的解决

  我们先来考虑一个w位的数据对象,将它表示为:[X-1,Xw-2,Xw-3......X0],其中Xw我们称之为最高有效位,X0称之为最低有效位,我们还假设w为8的倍数,这样可以方便将该数据划分为若干个字节,那么[Xw-1,Xw-2,Xw-3......Xw-8]为最高有效字节,[X7,X6,X5......X0]为最低有效字节。我们的存储单元地址则由低到高逐次递增,比如0x100->0x101->0x102......

  建立起这个基本模型后,我们安排多个字节时可以将最高有效字节放在最前面,叫做大端法。也可以将最低有效字节放在最前面,叫做小端法。而具体采用哪种顺序则取决于机器。知道机器的字节序表示方法这对于有些应用程序的开发非常重要。

——————————————————————————————

三、实例

  下面是一段程序实例,用以查阅不同类型数据在机器中表示方法。思路是:我们首先获取数据对象的存储地址,当然,对于跨多字节对象来说,我们只能得到存储他得首地址,然后根据类型的大小,可以遍历存储该对象的所有地址单元。我们不是说了吗,每个地址单元都对于存储一个字节,我们从前往后遍历数据对象的所有地址单元,并把它用十六进制显示,检查它到底是最高有效字节放前面还是最低有效字节放前面,就可以分辨出你的机器是大端法存储数据还是小端法存储数据了。

#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 show_pointer(void *x){
	show_bytes((byte_pointer)&x, sizeof(void *));
}
int main(){
	show_int(10);
	show_float(10);
	return 0;
}
注解:代码中我们定义了一个byte_pointer的数据类型,它为一个指向类型为 unsigned char的对象的指针类型,我们前面不是说了吗,数据类型可能是跨多个字节的,而unsigned char恰好是占据一个字节,这样我们可将数据地址通过强制转换为 unsigned char* 告诉编译器,程序一个把这里的地址看成一个字节序列,而不是指向一个原始的数据类型对象,即告诉编译器以一种新的方式来看待被指向的数据。打个比方说:有一层楼有很多个大小一致的房间,而且编了号,处于某种应用,比如家庭旅行住宿,每家都要挨在一块的四个房间,且看成一个整体,且用每个家庭的第一个房间就代表这一家,现在这种转换就是把每一家的房间以每一间的方式去看待里面的具体内容。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值