如果我有:
signed char * p;
我做了一个比较:
if ( *p == 0xFF )
break;
它永远不会捕获0XFF,但是如果我用-1替换它将会:
if ( *p == (signed char)0xFF )
break;
这怎么可能发生?这是标志旗吗?我虽然0xFF == -1 == 255
。
答案 0 :(得分:29)
值0xFF
是带符号的int值。在进行比较时,C会将*p
提升为int
,因此第一个if语句相当于:
if( -1 == 255 ) break;
当然是假的。通过使用(signed char)0xFF
语句等同于:
if( -1 == -1 ) break;
按预期工作。这里的关键点是比较是使用int
类型而不是signed char
类型完成的。
答案 1 :(得分:4)
整数文字已经签署了int类型。由于0xFF是signed int,编译器会将* p转换为signed int,然后进行比较。
当* p为-1,然后从signed char转换为signed int时,它仍为-1,表示为0xFFFFFFFF,不等于0xFF。
答案 2 :(得分:2)
为第一次比较转换为int,因为0xFF仍然被认为是int,这意味着你的char是-128到127,但是0xFF仍然是255。
在第二种情况下,你告诉它0xFF实际上是一个有符号的char,而不是int
答案 3 :(得分:1)
0xff将被视为一个整数常量,值为255.您应该始终注意不同类型之间的这种比较。如果您想确保编译器将生成正确的代码,您应该使用类型转换:
if( *p == (signed char)0xFF ) break;
无论如何,提防下一个语句不以相同的方式工作:
if( (int)*p == 0xFF ) break;
另外,也许最好避免使用签名字符,或者必须使用签名字符,将它们与签名值(如-1)进行比较:
if( *p == -1 ) break;
0xff == - 1仅当这些值被分配给某些char(或unsigned char)变量时才会出现:
char a=0xff; char b=-1; if(a==b) break;