[英]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.