代码之家  ›  专栏  ›  技术社区  ›  CiNN

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

c
  •  8
  • CiNN  · 技术社区  · 18 年前

    signed char * p;
    

    我做了一个比较:

    if ( *p == 0xFF )
       break;
    

    它永远不会捕获0XFF,但如果我将其替换为-1,它将:

    if ( *p == (signed char)0xFF )
       break;
    

    这怎么会发生?是不是有标志的东西?我想 0xFF == -1 == 255

    4 回复  |  直到 9 年前
        1
  •  29
  •   Greg Hewgill    18 年前

    价值 0xFF 是一个有符号的int值。C将促进 *p 到 int 进行比较时,第一个if语句等效于:

    if( -1 == 255 ) break;
    

    (signed char)0xFF 该声明相当于:

    if( -1 == -1 ) break;
    

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

        2
  •  4
  •   Niall    18 年前

        3
  •  2
  •   Fire Lancer    18 年前

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

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

        4
  •  1
  •   botismarius    18 年前

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

    if( *p == (signed char)0xFF ) break;
    

    无论如何 当心 下一个声明将 以同样的方式工作:

    if( (int)*p == 0xFF ) break;
    

    另外,最好避免使用带符号的字符,或者,您必须使用带符号的字符,以便将它们与带符号的值进行比较,例如在本例中为-1:

    if( *p == -1 ) break;
    

    char a=0xff;
    char b=-1;
    if(a==b) break;