2017-07-27 11 views
-4

Ich habe den folgenden Code-Snippetint zu char Typumwandlung

#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); 
} 

mit diesem Ausgang

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

Könnte jemand erklären, warum die zweite und vierte Ausgänge -113 kommen und aced sind. Vielen Dank.

+2

Ich kann verstehen, warum Sie über die zweite verwirrt sind. Aber warum um die vierte? –

+2

Es ist eine Hexadezimalzahl. Kommt mir bekannt vor? –

+0

% x erzeugt hex. ACED basae 16 = 10 * 16^3 + 12 * 16^2 + 14 * 16^1 + 13 * 16^0 (genau wie 456 base 10 = 4 * 10^2 + 5 * 10^1 + 6 * 10^0) – ikegami

Antwort

-3

char c1 = i1; ist undefiniertes Verhalten. i1 ist 399, die mindestens 2 Bytes benötigt, um repräsentiert zu werden, während char 1 Byte ist. Die Ausgabe, die Sie haben, ist nur die Kürzung von 399 = 110001111 in binär zu 1 Byte: 10001111 = unterzeichnet -133, aber da es UB ist, könnte es alles andere genauso sein

Die vierte ist nur die Hexadezimalzahl Darstellung der Zahl

+7

Es ist tatsächlich * implementation-defined *. http://port70.net/~nsz/c/c11/n1570.html#6.3.1.3p3 –

+1

"i1 ist 399, die mindestens 2 Bytes benötigt, um dargestellt zu werden" - falsch. Und du hast die wahre UB nicht verstanden. – Olaf