c,unsigned char和char上的相等运算符

时间:2017-09-19 02:45:13

标签: c char operators equality unsigned

当我将 int unsigned int

进行比较时,为什么我可以获得“x == y”

然后,当我将 char unsigned 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

5 个答案:

答案 0 :(得分:2)

来自C11 ISO / IEC 9899:201x标准:

  

否则,如果具有无符号整数类型的操作数具有   等级大于或等于另一个类型的等级   操作数,那么带有符号整数类型的操作数是   转换为带无符号整数的操作数类型   类型。

在与int y = 0xFFFFFFFF比较之前,促销适用于unsigned int x = 0xFFFFFFFF。将int y提升为unsigned int会保留值0xFFFFFFFF,从而导致x == y

另一方面:

  

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

这意味着unsigned char a = 0xFF&amp;在比较之前,char b = 0xFF都会转换为signed int。但转换b会导致符号扩展,这意味着b的值已扩展为0xFFFFFFFF == -1,导致int a = 255大于int b = -1

答案 1 :(得分:1)

C通常会将int的积分值提升为操作。对于unsigned char u = 0xFFu;signed char s = 0xFF;,在评估u == s s时会进行符号扩展,而u则不会被解释为0xFF == -1

答案 2 :(得分:1)

因为促销

在进行任何比较之前,

char 类型将提升为 int

所以

unsigned char a = 0xFF将被提升为0x000000FF(255)

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

他们不平等。

答案 3 :(得分:1)

逐步:忽略位模式并专注于类型和值。

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

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

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

如果将这些值与0进行比较,则值不会更改,但会将其提升为int。 §6.3.1.12

当然,-1&lt; 0,255&gt; 0和-1!= 255。

答案 4 :(得分:-1)

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

IF(-1!= 255){     然后//总是跑 }