C traps and pitfalls-连接

假定一个程序在一个源文件中包含了声明

long foo;

而在另一个源文件中包含了:

extern short foo;

又进一步假定,如果给long类型的foo赋一个较小的值,例如37,那么short类型的foo就同时获得了一个值37,我们能够对运行该程序的硬件作出什么样的推断?如果short类型的foo得到的值不是37而是0,我们又能够作出什么样的推断?

如果把值37赋给long型的foo,相当于同时把值37也赋给了short型的foo,那么这意味着short型的foo,与long型的foo中包含了值37的有效位的部分,两者在内存中占用的是同一区域。这有可能是因为long型和short型被实现为同一类型,但很少有C语言实现会这样做。更有可能的是,long型的foo的低位部分与short型的foo共享了相同的内存空间,一般情况下,这个部分所处的内存较低,因此我们的一个可能推论就是,运行该程序的硬件是一个低位优先(little-endian)的机器。同样道理,如果在long型的foo中存储了值37,而short型的foo的值却是0,我们所用的硬件可能是一个高位优先(big-endian)的机器。


译注:Endian的意思是“数据在内在中的字节排列顺序”,表示一个字在内存中或传送过程中的字节顺序。在微处理器中,像long/DWRD(32bit)0x12345678这样的数据总是按照高位优先(BIG ENDIAN)方式存放的。但在内存中,数据存放顺序则因微处理器厂商的不同而不同。一种顺序称为big-endian,即把最高位字节放在最前面;另一种顺序就称为little-endian,即把最高低字节放在最前面。

BIG ENDIAN:最低地址存放高字节,可称为高位优先。内存从最低地址开始,按顺序存放。BIG ENDIAN存放方式正是我们的书写方式,高数位数字先写(比如,总是按照千、百、十、个位来书写数字)。而且所有的处理器都是按照这个顺序存放数据的。

LITTLE ENDIAN:最低地址存放低位字节,可称为低位优先。内存从最低地址开始,顺序存放。LITTLE ENDIAN处理器是通过硬件将内在中的LITTLE ENDIAN排列顺序转换到寄存器的BIG ENDIAN排列顺序的,没有数据加载/存储的开销,不用担心。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值