实例代码;
char a = -1;
char b = 1;
if (a == b - (char)2)
{
printf("aaaaaaaaaaaaaaa\n");
}
在x86平台(linux, gnu c)下,if判断为真,可以打印aaaaaaaaaaaaaaaaaaa
在ppc平台(linux, gnu c)下,if判断为假,不会打印。
ppc平台下的代码反汇编分析:
objdump一把,汇编指令如下:
2940 2d58: 88 1f 00 11 lbz r0,17(r31) /* 加载变量a的值,并清除无关的3字节数据(char)*/
2941 2d5c: 54 09 06 3e clrlwi r9,r0,24
2942 2d60: 80 1f 00 30 lwz r0,48(r31)
2943 2d64: 7c 0b 03 78 mr r11,r0
2944 2d68: 88 0b 00 68 lbz r0,104(r11) /* 加载变量b的值,并清除无关的3字节数据(char)*/
2945 2d6c: 54 00 06 3e clrlwi r0,r0,24
2946 2d70: 30 00 ff fe addic r0,r0,-2
2947 2d74: 7f 89 00 00 cmpw cr7,r9,r0
从红色字体中可以看出来,addic后,结果是4字节r0,然后是直接使用这个4字节r0去和r9(只留了1个字节的数据)比较。
2947 2d74: 7f 89 00 00 cmpw cr7,r9,r0 /* 这里实际上是在比较两个int型数, 就是 0x000000ff 和 0xffffffff在比较,所以,结果是不相等的*/
但是,倘若在x86下,这里肯定有一条类型转换的语句,将0xffffffff转成char型。
所以,我们在编写类似的程序时,应该加上强制类型转换,以免代码移植时出问题。
if ( a == (char)(b - (char)2) )
阅读(1433) | 评论(0) | 转发(0) |