【问题标题】:c,equality operator on unsigned char and charc,unsigned char 和 char 上的等式运算符
【发布时间】:2018-02-27 16:20:36
【问题描述】:

当我将 intunsigned int

进行比较时,为什么会得到 "x==y"

那么,当我将 charunsigned 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 operators equality unsigned


【解决方案1】:

C 通常将整数值提升为ints 以进行操作。对于unsigned char u = 0xFFu;signed char s = 0xFF;,在评估u == s 时,s 是符号扩展的,而u 不是,因此它被解释为0xFF == -1

【讨论】:

    【解决方案2】:

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

    如果 (-1 != 255){ 然后 // 总是运行 }

    【讨论】:

      【解决方案3】:

      因为促销

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

      所以

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

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

      它们不相等。

      【讨论】:

        【解决方案4】:

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

        否则,如果具有无符号整数类型的操作数具有 等级大于或等于其他类型的等级 操作数,则带符号整数类型的操作数为 转换为无符号整数的操作数类型 输入。

        在与unsigned int x = 0xFFFFFFFF 进行比较之前,该促销应用于int y = 0xFFFFFFFF。将 int y 提升为 unsigned int 将保留值 0xFFFFFFFF,这将导致 x == y

        另一方面:

        如果一个 int 可以表示原始类型的所有值(如 受宽度限制,对于位域),值为 转换为 int ;否则,将其转换为无符号 诠释。这些被称为整数促销。所有其他 整数提升不会改变类型。整数 促销保值,包括标志。正如所讨论的 早些时候,“普通”字符是否被视为已签名是 实现定义。

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

        【讨论】:

          【解决方案5】:

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

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

          unsigned char a = 0xFF 将 255 分配给可以表示您平台上的值 [0-255] 的 unsigned chara 获取值 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.1 2

          当然,-1 0 和 -1 != 255。

          【讨论】:

            猜你喜欢
            • 2023-03-20
            • 1970-01-01
            • 2011-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-05-15
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多