以前看书的时候看到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) |