大小端编程注意事项
程序员文章站
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型到底是带符号还是不带符号,虽然大多情况下是带符号的。
还有就是严格的参数传递,最好需要什么类型的参数,就定义什么类型的参数。不要对编译器做任何假定!
摘自 井朝天的专栏
但是,好多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型到底是带符号还是不带符号,虽然大多情况下是带符号的。
还有就是严格的参数传递,最好需要什么类型的参数,就定义什么类型的参数。不要对编译器做任何假定!
摘自 井朝天的专栏