提问人:user3094631 提问时间:9/19/2017 更新时间:9/19/2017 访问量:1245
c,无符号 char 和 char 上的相等运算符
c,equality operator on unsigned char and char
问:
为什么当我将 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 通常将整数值提升为 s 以进行运算。对于 和 ,在计算中是符号扩展的,而不是 ,它被解释为 。int
unsigned char u = 0xFFu;
signed char s = 0xFF;
u == s
s
u
0xFF == -1
有符号整数使用最高有效位来存储负数,因此在硬件级逻辑中,您问过:
如果 (-1 != 255){ then // 始终运行 }
因为晋升。
char 或 short 类型将在任何比较之前提升为 int。
所以
unsigned char a = 0xFF
将晋升至0x000000FF(255)
char b = 0xFF
将晋升为0xFFFFFFFF(-1)
他们不相等。
根据 C11 ISO/IEC 9899:201x 标准:
否则,如果具有无符号整数类型的操作数具有 等级大于或等于对方类型的等级 操作数,则有符号整数类型的操作数为 转换为具有无符号整数的操作数的类型 类型。
促销在与 比较之前应用。提升到 将保持值0xFFFFFFFF,这会导致 .
另一方面:int y = 0xFFFFFFFF
unsigned int x = 0xFFFFFFFF
int y
unsigned int
x == y
如果 int 可以表示原始类型的所有值(如 受宽度限制,对于位字段),该值为 转换为 int ;否则,它将转换为无符号 int 的 。这些称为整数促销。所有其他 类型不因整数升级而改变。整数 促销保留了价值,包括标志。如前所述 前面,“普通”字符是否被视为已签名是 实现定义。
这意味着 & 都转换为比较之前。但是,转换将导致符号扩展,这意味着 的值被扩展为大于 。unsigned char a = 0xFF
char b = 0xFF
signed int
b
b
0xFFFFFFFF == -1
int a = 255
int b = -1
循序渐进:忽略位模式,专注于类型和值。
0xFF
是一个整数常量,值为 255,类型为 。(C11 §6.4.4.1 5)int
unsigned char a = 0xFF
将 255 分配给可以表示平台上的值 [0-255] 的 an。 获取值 255 并键入 。6.3.1.3 1unsigned char
a
unsigned char
char b = 0xFF;
将 255 分配给 that,在您的平台上可以表示值 [-128 - 127]。该值以实现定义的方式进行转换。
在 OP 的情况下,减去 256 并得到 -1 的值和 type 。6.3.1.3 3char
b
char
当这些值与 0 进行比较时,这些值不会更改,但它们会提升为 。§6.3.1.1 2int
当然,-1 < 0、255 > 0 和 -1 != 255。
评论