【发布时间】:2010-09-08 20:11:06
【问题描述】:
如果我有:
signed char * p;
我做了一个比较:
if ( *p == 0xFF )
break;
它永远不会捕获 0XFF,但如果我用 -1 替换它,它会:
if ( *p == (signed char)0xFF )
break;
怎么会这样?是标志标志的东西吗?我虽然是0xFF == -1 == 255。
【问题讨论】:
标签: c
如果我有:
signed char * p;
我做了一个比较:
if ( *p == 0xFF )
break;
它永远不会捕获 0XFF,但如果我用 -1 替换它,它会:
if ( *p == (signed char)0xFF )
break;
怎么会这样?是标志标志的东西吗?我虽然是0xFF == -1 == 255。
【问题讨论】:
标签: c
值0xFF 是一个有符号整数值。 C 在进行比较时会将*p 提升为int,因此第一个if 语句相当于:
if( -1 == 255 ) break;
这当然是错误的。通过使用(signed char)0xFF,该语句等效于:
if( -1 == -1 ) break;
如您所愿。这里的关键点是比较是用int 类型而不是signed char 类型完成的。
【讨论】:
整数文字具有带符号的 int 类型。由于 0xFF 是有符号整数,因此编译器将 *p 转换为有符号整数,然后进行比较。
当*p为-1,然后从signed char转换为signed int,仍然是-1,表示为0xFFFFFFFF,不等于0xFF。
【讨论】:
第一次比较时它会转换为 int,因为 0xFF 仍被视为 int,这意味着您的 char 是 -128 到 127,但 0xFF 仍然是 255。
在第二种情况下,你告诉它 0xFF 实际上是一个有符号字符,而不是一个 int
【讨论】:
0xff 将被视为一个整数常量,其值为 255。您应始终注意这些不同类型之间的比较。如果你想确保编译器会生成正确的代码,你应该使用类型转换:
if( *p == (signed char)0xFF ) 中断;无论如何,注意下一个语句将不以相同的方式工作:
if( (int)*p == 0xFF ) 中断;另外,最好避免使用带符号的字符,或者,您必须使用带符号的字符,在这种情况下将它们与带符号的值(例如 -1)进行比较:
if( *p == -1 ) 中断;0xff==-1 仅当这些值将分配给某些 char(或 unsigned char)变量时:
字符 a=0xff; 字符 b=-1; 如果(a==b)中断;【讨论】: