C变量和常数值比较不匹配

时间:2008-09-14 09:29:40

标签: c

如果我有:

signed char * p;

我做了一个比较:

if ( *p == 0xFF )
   break;

它永远不会捕获0XFF,但是如果我用-1替换它将会:

if ( *p == (signed char)0xFF )
   break;

这怎么可能发生?这是标志旗吗?我虽然0xFF == -1 == 255

4 个答案:

答案 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;