Chinaunix首页 | 论坛 | 博客
  • 博客访问: 637920
  • 博文数量: 51
  • 博客积分: 773
  • 博客等级: 军士长
  • 技术积分: 2392
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-07 21:32
文章分类
文章存档

2018年(1)

2013年(16)

2012年(34)

分类: C/C++

2018-04-09 21:40:32

   以前看书的时候看到char在C语言标准中没有规定是有符号还是无符号,并没有深刻印象,今天在工作中遇到跨平台移植的时候,才发现这是个坑。
  今天将一个在x86平台的程序移植到arm平台的时候,发现在x86平台上运行正常的程序在arm平台却出现了奇怪的问题。这段程序用char类型的一个变量去获取一个函数的返回值,然后将返回值与-1进行比较,在x86平台这个变量与-1相等就会跳出循环,而在arm平台函数的返回值明明返回的是-1,char类型变量值也是0xFF,与-1比较的时候却不相等。
   通过验证才发现char在使用的x86平台的gcc中实现的是有符号的,与-1比较时,提升为int类型时,高位填充的是符号位,即将0xFF提升为0xFFFFFFFF,与-1相等。而在使用的arm平台上,char实现的是无符号类型,提升为int类型时,高位填充的是0,即将0xFF提升为0x000000FF,与-1当然不会相等,将char变量声明为signed char后,代码运行正常。
   char类型不像int类型一样强制规定为有符号,而是各实现自己决定实现为有符号还是无符号,不知是出于什么考虑,还是大师也有打盹的时候?
阅读(2541) | 评论(0) | 转发(0) |
0

上一篇:一个简单的迷宫题

下一篇:没有了

给主人留下些什么吧!~~