簡體   English   中英

int 到 char 轉換,奇怪的行為

[英]int to char cast, strange behavior

考慮以下:

unsigned int  i1 = 0xFFFFFFFF;
unsigned char c1 = i1;
char          c2 = i1;

printf("%x\n", i1);       // 0xFFFFFFFF as expected
printf("%x\n", c1);       // 0xFF as expected
printf("%x\n", c2);       // 0xFFFFFFFF ????
printf("%d\n", c1 == c2); // false ????

我知道,不應將int分配給char 無論如何,看看c2似乎存儲的不僅僅是一個字節。 我所期望的是將n1的“不太重要的字節”復制到c2中。 我認為這是錯誤的嗎? 根本就沒有副本嗎? 為什么unsigned char的行為與char不同?


在使用gethostbyname()時,我實際上在一個非常具體的情況下發現了這一點。 它返回一個結構,其中包含一個字段char *h_addr ,該字段存儲一個 ipv4 地址(四個 8 位長的數字)。 我想將 ip 地址打印為數字,但結果異常大。


我知道一種解決方法,使用i1 & 0xFF進行屏蔽可以工作,但我想了解這個問題。

在您的系統中,類型char的行為與類型signed char相同。

在這個任務之后

char          c2 = n1;

注意:似乎有一個錯字,你的意思是

char          c2 = i1;

變量 c2 的值為0xff ,即-1

在這次通話中

printf("%x\n", c2);

由於 integer 促銷活動,參數表達式c2被轉換為int類型來傳播符號位。 並且這個值是按照%x格式輸出的。

注意你需要寫

printf( "%x\n",( unsigned int ) c2 );

因為轉換說明符x需要類型為unsigned int的 object 。

如果要獲得預期的結果,則需要 output 使用轉換修飾符hh將對象作為字符類型的對象。 例如

#include <stdio.h>

int main(void) 
{
    unsigned int  i1 = 0xFFFFFFFF;
    unsigned char c1 = n1;
    char          c2 = n1;

    printf( "%x\n", i1 );
    printf( "%hhx\n", c1 );
    printf( "%hhx\n", c2 );
}

程序 output 是

ffffffff
ff
ff

另外,您似乎打錯了字並寫了

printf("%d\n", n3 == n2);

代替

printf("%d\n", c1 == c2);

如果是這樣,那么由於 integer 促銷活動,比較運算符的操作數再次被隱式轉換為int類型。 由於操作數c1具有unsigned char類型,因此它被轉換為值0x000000FF而操作數c2因為它存儲負值被轉換為值0xFFFFFFFF 所以結果值不相等。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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