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

C变量和常量值比较不匹配,c,C,如果我有: 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; if( -1 == -1

如果我有:

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;
if( -1 == -1 ) break;
这当然是错误的。通过使用
(有符号字符)0xFF
语句相当于:

if( -1 == 255 ) break;
if( -1 == -1 ) break;

正如你所期望的那样。这里的关键点是,比较是用
int
类型而不是
signed char
类型来完成的。

由于0xFF仍然被视为int,这意味着您的char是-128到127,但0xFF仍然是255,因此第一次比较时它会强制转换为int


在第二种情况下,您告诉它0xFF实际上是一个有符号字符,而不是一个int

整数文本具有有符号int类型。由于0xFF是有符号整数,编译器将*p转换为有符号整数,然后进行比较


当*p为-1时(随后从有符号字符转换为有符号整数),它仍然是-1,表示为0xFFFFFF,不等于0xFF。

0xFF将被视为一个整数常量,值为255。你应该经常注意不同类型之间的这种比较。如果要确保编译器将生成正确的代码,应使用类型转换:

if( *p == (signed char)0xFF ) break; 如果(*p==(有符号字符)0xFF)中断; 无论如何,请注意,下一条语句的工作方式不同:

if( (int)*p == 0xFF ) break; 如果((int)*p==0xFF)中断; 另外,最好避免使用带符号的字符,或者,您必须使用带符号的字符,以便将它们与带符号的值进行比较,例如在本例中为-1:

if( *p == -1 ) break; 如果(*p==-1)中断; 0xff==-1,仅当这些值将分配给某些字符(或无符号字符)变量时:

char a=0xff; char b=-1; if(a==b) break; 字符a=0xff; 字符b=-1; 如果(a==b)中断;
0xFF是有符号的,而不是无符号的。0xFFU是未签名的版本。只有*p需要提升。