<论题>
论题如文章标题, 以下为实例解释:
<实例解释>
typedef unsigned int U32;
typedef signed int S32;
<1> 典型错误:
U32 x = 1;
if(-1 > x)
uart0_putnum(0xaa, 0x10);
else
uart0_putnum(0xbb, 0x10);
结果: 返回值并非为 0xbb, 而是 0xaa.
提示: 编译器给出该错误语法的提示: "Warning[Pe068]: integer conversion resulted in a change of sign".
注释: 编译器使用 IAR.
<2> 更隐蔽的错误:
S32 a = -1;
U32 x = 1;
if(a > x)
uart0_putnum(0xaa, 0x10);
else
uart0_putnum(0xbb, 0x10);
结果: 返回值仍然是意外的 0xaa.
提示: 此时编译器无任何警告错误, 这个bug 编译器无法识别.
<3> Fix:
S32 a = -1;
U32 x = 1;
if(a > (S32)x)
uart0_putnum(0xaa, 0x10);
else
uart0_putnum(0xbb, 0x10);
方式: 强制无符号整数类型为有符号整数, 在同为有符号整数类型下, 再次进行比较.
结果: 返回值为正确的 0xbb.
<结论>
一个很小的知识点, 隐藏一个编译器无法识别的bug. 在编写C代码时, 工程师应自行注意类型不同时, 应使用强制类型, 进行比较语句.
Allen
2011.01.19 作于深圳
allen_zhan_752827529 2011-10-8 17:01