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

时间:2020-03-05 18:52:56  来源:igfitidea点击:

如果我有:

signed char * p;

我做一个比较:

if ( *p == 0xFF )
   break;

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

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

怎么会这样带有标志的东西吗?我虽然那个0xFF == -1 == 255

解决方案

回答

值" 0xFF"是有符号的int值。 C在进行比较时会将* p提升为int,因此第一个if语句等效于:

if( -1 == 255 ) break;

这当然是错误的。通过使用(signed char)0xFF`语句等同于:

if( -1 == -1 ) break;

可以按我们期望的那样工作。这里的关键点是,比较是使用int类型而不是使用signed char类型进行的。

回答

由于第一次将0xFF仍视为int,因此它会转换为int,这意味着char为-128至127,但0xFF仍为255.

在第二种情况下,我们告诉它0xFF实际上是一个带符号的char,而不是一个int

回答

整数文字已对int类型进行了签名。由于0xFF是带符号的int,因此编译器将* p转换为带符号的int,然后进行比较。

当* p为-1(然后从有符号的char转换为有符号的int)时,它仍为-1,其表示形式为0xFFFFFFFF,不等于0xFF。

回答

0xff将被视为整数常量,其值为255. 我们应始终注意不同类型之间的此类比较。如果要确保编译器将生成正确的代码,则应使用typecast:

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

无论如何,请注意下一条语句不会以相同的方式起作用:

if( (int)*p == 0xFF ) break;

另外,也许最好避免使用带符号的字符,或者在这种情况下,必须使用带符号的字符将它们与带符号的值(例如-1)进行比较:

if( *p == -1 ) break;

仅当将这些值分配给某些char(或者无符号char)变量时,才为0xff ==-1:

char a=0xff;
char b=-1;
if(a==b) break;