大小端编程注意事项
一般情况下,我们所遇到的都是小端的情况,典型的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型到底是带符号还是不带符号,虽然大多情况下是带符号的。
还有就是严格的参数传递,最好需要什么类型的参数,就定义什么类型的参数。不要对编译器做任何假定!
摘自 井朝天的专栏
补充:软件开发 , C语言 ,