Chinaunix首页 | 论坛 | 博客
  • 博客访问: 750374
  • 博文数量: 215
  • 博客积分: 291
  • 博客等级: 二等列兵
  • 技术积分: 1031
  • 用 户 组: 普通用户
  • 注册时间: 2010-05-12 18:17
文章分类

全部博文(215)

文章存档

2016年(16)

2015年(16)

2014年(123)

2013年(60)

分类: 嵌入式

2013-12-27 19:11:21

实例代码;

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) ) 



阅读(1377) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~