【问题标题】:C variable and constant value comparison not matchingC变量和常量值比较不匹配
【发布时间】: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


    【解决方案1】:

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

    if( -1 == 255 ) break;
    

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

    if( -1 == -1 ) break;
    

    如您所愿。这里的关键点是比较是用int 类型而不是signed char 类型完成的。

    【讨论】:

    • 0xFF 是有符号的,而不是无符号的。 0xFFU 是无符号版本。只有 *p 需要提升。
    【解决方案2】:

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

    当*p为-1,然后从signed char转换为signed int,仍然是-1,表示为0xFFFFFFFF,不等于0xFF。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        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)中断;

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-08-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-01-13
          相关资源
          最近更新 更多