[英]c,equality operator on unsigned char and char
當我比較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
根據C11 ISO / IEC 9899:201x標准:
否則,如果具有無符號整數類型的操作數的秩大於或等於另一個操作數的類型的秩,則將帶符號整數類型的操作數轉換為無符號整數類型的操作數的類型。
在與unsigned int x = 0xFFFFFFFF
比較之前,對int y = 0xFFFFFFFF
應用提升。 將int y
提升為unsigned int
將保持值0xFFFFFFFF,這將導致x == y
。
另一方面 :
如果int可以表示原始類型的所有值(對於位字段,受寬度限制),則該值將轉換為int; 否則,將其轉換為unsigned int。 這些稱為整數促銷。 整數促銷未更改所有其他類型。 整數促銷保留包括符號在內的價值。 如前所述,是否將“普通”字符視為已簽名是實現定義的。
這意味着在比較之前, unsigned char a = 0xFF
& char b = 0xFF
都被轉換為signed int
。 但是,轉換b
將導致符號擴展,這意味着b
值擴展為0xFFFFFFFF == -1
導致int a = 255
大於int b = -1
。
C通常將整數值提升為int
進行運算。 對於unsigned char u = 0xFFu;
並signed char s = 0xFF;
,在評估u == s
s
是符號擴展的,而u
不是,因此將其解釋為0xFF == -1
。
因為晉升 。
在進行任何比較之前, char或short類型將被提升為int 。
所以
unsigned char a = 0xFF
將被提升為0x000000FF(255)
char b = 0xFF
將提升為0xFFFFFFFF(-1)
他們不平等。
循序漸進:忽略位模式,將重點放在類型和值上。
0xFF
是一個整數常量 ,值為255,類型為int
。 (C11§6.4.4.15)
unsigned char a = 0xFF
將255分配給可以代表平台上的[0-255]值的unsigned char
。 a
獲得255的值,並鍵入unsigned char
。 6.3.1.3 1
char b = 0xFF;
將255分配給在您的平台上可以表示值[-128-127]的char
。 該值以實現定義的方式轉換。 在OP的情況下,將減去256, b
獲得值-1並輸入char
。 6.3.1.3 3
將它們與0進行比較時,這些值不會更改,但會提升為int
。 §6.3.1.12
當然,-1 <0,255> 0和-1!= 255。
有符號整數使用最高有效位來存儲負數,因此在硬件級邏輯中,您已經詢問:
IF(-1!= 255){然后//始終運行}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.