c,无符号 char 和 char 上的相等运算符

c,equality operator on unsigned char and char

提问人:user3094631 提问时间:9/19/2017 更新时间:9/19/2017 访问量:1245

问:

为什么当我将 int 与无符号 int 进行比较时会得到“x==y”

那么,为什么当我将 char 与无符号 char 进行比较时,我会得到a!=b”,尽管它们确实具有相同的位模式“0xff"

在应用相等运算符时,是否考虑了变量类型?

法典:

#include <stdio.h>

int main() 
{
    unsigned int x = 0xFFFFFFFF;
    int y = 0xFFFFFFFF;
    printf("unsigned int x = 0xFFFFFFFF;\n");
    printf("int y = 0xFFFFFFFF;\n");
    if (x < 0)
        printf("x < 0\n");
    else
        printf("x > 0\n");
    if (y < 0)
        printf("y < 0\n");
    else
        printf("y > 0\n");
    if(x==y)
        printf("x==y\n\n");
    ///////////-- char --////////////////////////
    unsigned char a = 0xFF;
    char b = 0xFF;    
    printf("unsigned char a = 0xFF\n");
    printf("char b = 0xFF\n");
    if (a < 0)
        printf("a < 0\n");
    else
        printf("a > 0\n");
    if (b < 0)
        printf("b < 0\n");
    else
        printf("b > 0\n");
    if(a==b)
        printf("a==b\n");   
    else
        printf("a!=b\n");

}

输出:

unsigned int x = 0xFFFFFFFF;
int y = 0xFFFFFFFF;
x > 0
y < 0
x==y

unsigned char a = 0xFF
char b = 0xFF
a > 0
b < 0
a!=b
c char 运算符 相等 无符号

答:

1赞 thetic 9/19/2017 #1

C 通常将整数值提升为 s 以进行运算。对于 和 ,在计算中是符号扩展的,而不是 ,它被解释为 。intunsigned char u = 0xFFu;signed char s = 0xFF;u == ssu0xFF == -1

-1赞 Patrick Sturm 9/19/2017 #2

有符号整数使用最高有效位来存储负数,因此在硬件级逻辑中,您问过:

如果 (-1 != 255){ then // 始终运行 }

2赞 Wang HongQin 9/19/2017 #3

因为晋升

charshort 类型将在任何比较之前提升为 int

所以

unsigned char a = 0xFF将晋升至0x000000FF(255)

char b = 0xFF将晋升为0xFFFFFFFF(-1)

他们不相等。

2赞 Karim Manaouil 9/19/2017 #4

根据 C11 ISO/IEC 9899:201x 标准:

否则,如果具有无符号整数类型的操作数具有 等级大于或等于对方类型的等级 操作数,则有符号整数类型的操作数为 转换为具有无符号整数的操作数的类型 类型。

促销在与 比较之前应用。提升到 将保持值0xFFFFFFFF,这会导致 .

另一方面:
int y = 0xFFFFFFFFunsigned int x = 0xFFFFFFFFint yunsigned intx == y

如果 int 可以表示原始类型的所有值(如 受宽度限制,对于位字段),该值为 转换为 int ;否则,它将转换为无符号 int 的 。这些称为整数促销。所有其他 类型不因整数升级而改变。整数 促销保留了价值,包括标志。如前所述 前面,“普通”字符是否被视为已签名是 实现定义。

这意味着 & 都转换为比较之前。但是,转换将导致符号扩展,这意味着 的值被扩展为大于 。unsigned char a = 0xFFchar b = 0xFFsigned intbb0xFFFFFFFF == -1int a = 255int b = -1

1赞 chux - Reinstate Monica 9/19/2017 #5

循序渐进:忽略位模式,专注于类型和值。

0xFF是一个整数常量,值为 255,类型为 。(C11 §6.4.4.1 5)int

unsigned char a = 0xFF将 255 分配给可以表示平台上的值 [0-255] 的 an。 获取值 255 并键入 。6.3.1.3 1unsigned charaunsigned char

char b = 0xFF;将 255 分配给 that,在您的平台上可以表示值 [-128 - 127]。该值以实现定义的方式进行转换。 在 OP 的情况下,减去 256 并得到 -1 的值和 type 。6.3.1.3 3charbchar

当这些值与 0 进行比较时,这些值不会更改,但它们会提升为 。§6.3.1.1 2int

当然,-1 < 0、255 > 0 和 -1 != 255。