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需要提升。