簡體   English   中英

c,unsigned char和char上的等號運算符

[英]c,equality operator on unsigned char and char

當我比較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

根據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 = 0xFFchar 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

因為晉升

在進行任何比較之前, charshort類型將被提升為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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM