欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

大小端编程注意事项

程序员文章站 2023-01-12 23:40:45
一般情况下,我们所遇到的都是小端的情况,典型的x86处理器就是小端的。   但是,好多powerpc处理器可以被配置为大端模式,也可以被配置为小端模式。所以,经常会出...
一般情况下,我们所遇到的都是小端的情况,典型的x86处理器就是小端的。
 
但是,好多powerpc处理器可以被配置为大端模式,也可以被配置为小端模式。所以,经常会出现以前的代码运行的好好地,到了新板子,或者板子配置
 
发生了变化,结果就不对了,而且很难调试。因为根本不会认为它出错。
 
下面就举个我们代码中调了好久才发现的问题。
 
又一个函数:
 
i2c_write(..., unsigned char *reg, ...)
 
这里的reg类型为一个unsigned char 型的指针,代表i2c设备的寄存器地址。
 
以前的代码,在传参数之前,会声明一个类型为int的ctest, 然后做如下调用
 
i2c_write(..., (unsigned char *)&ctest, ...);
 
在以前的simba板子上,这样做没有出现任何问题。simba是一块powerpc平台的mpc8572的板子,当时配置为小端模式。
 
是,小端的话这样看来一般确实不会出现什么问题。
 
比如
 
int ctest = 2;
 
也就是ctest = 0x00000002, 那么传进去的指针指向0x02所在的地址,也就是ctest的地址的最低一位。
 
现在换成tembo板子,tembo是一块powerpc平台的p4080的板子,配置为大端模式。
 
仍然是
 
int ctest = 2;
 
也就是ctest = 0x00000002, 那么现在传进去的指针还指向0x02所在的地址吗?
 
很显然不是!
 
我们看(unsigned char *)&ctest 这个操作,这个c标准肯定有规定,将得到一个指向&ctest的最低地址的unsigned char型指针。
 
此时,&ctest的最低位在最高有效位,内容为0x00,所以,肯定不会得到正确的结果!
 
就这么一个小小的问题,花了好久才得到解决。归根结底,还是习惯导致的。
 
平常写代码太过随意,也不管什么平台,也不注意参数类型,其实,对于参数的定义,类型中的signed 和unsigned 最好带上。
 
因为不能假设编译器会认为char型到底是带符号还是不带符号,虽然大多情况下是带符号的。
 
还有就是严格的参数传递,最好需要什么类型的参数,就定义什么类型的参数。不要对编译器做任何假定!
 
 
 
 摘自 井朝天的专栏