当我将 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
答案 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){ 然后//总是跑 }