2017-07-27 248 views
-4

我的代碼INT爲CHAR類型轉換

#include <stdio.h> 

int main() 
{ 
int i1 = 0x18f; 
char c1 = i1; 
char c2 = 15; 
unsigned short s1 = 0174670; 
printf("1) %o\n", i1); 
printf("2) %d\n", c1); 
i1 = c1; 
printf("3) %d\n", i1 & c2); 
printf("4) %x\n", s1 ^= 0x5555); 
} 

下面的片段與這個輸出

1) 617 
2) -113 
3) 15 
4) aced 

可能有人解釋爲什麼在第二和第四輸出出來-113和分別杆進洞。謝謝。

+2

我能理解你爲什麼對第二個感到困惑。但爲什麼關於第四? –

+2

這是一個十六進制數字。聽起來很熟悉? –

+0

%x產生十六進制。 ACED basae 16 = 10 * 16^3 + 12 * 16^2 + 14 * 16^1 + 13 * 16^0(就像456鹼基10 = 4 * 10^2 + 5 * 10^1 + 6 * 10^0) – ikegami

回答

-3

char c1 = i1;是未定義的行爲。 i1是399,當char爲1個字節時,需要至少2個字節的表示。你所擁有的輸出只是399 = 110001111的二進制截斷到1個字節:10001111 = signed -133,但因爲它是UB,所以它可以是其他任何東西

第四個只是數字的十六進制表示

+7

它實際上是* implementation-defined *。 http://port70.net/~nsz/c/c11/n1570.html#6.3.1.3p3 –

+1

「i1是399,需要至少2個字節才能表示」 - 錯誤。你沒有看到真正的UB。 – Olaf