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;