2016-12-24 3 views
2

Im folgenden Programm würde ich erwarten, dass nur das erste Byte der Variablen i vom Zeiger j gelesen wird. Aber es gibt einen großen Wert als Ausgabe. Bitte lassen Sie mich Ihre Meinung wissen.Falscher Datentyp in der Zeigerdeklaration

#include <stdio.h> 
#include <limits.h> 
int main() 
{ 
    int i = 2147483647; 
    char *j; 
    j = &i; 
    printf("Value of i = %u\n", *j); 
    printf("Max value of INT = %d\n", INT_MAX); 
    return 0; 
} 

Ausgang:

Wert von i = 4294967295 Max Wert von INT = 2147483647

+5

2147483647 (0x7FFFFFFF), '* j' = 0xFF (-1) (Little-Endian),' -1' ==> unsigned (32bit) ==> 4294967295 – BLUEPIXY

+0

Dies liegt daran, dass 'char' Implementierung' ist signiertes Zeichen ". Also, damit es so funktioniert, wie Sie es erwarten würden, wie 'printf (" Wert von i =% u \ n ", (unsigniertes Zeichen) * j);'. – BLUEPIXY

+0

In anderen Umgebungen kann 'char' in' unsigned char' implementiert werden. – BLUEPIXY

Antwort

-1

Sie i als Unsigned integer sind Anzeigen, so dass es Variable berücksichtigen wird 'i' als ein großer Wert. Sie sollten das externe Casting verwenden, während der i-Wert als (char) angezeigt wird. J

+0

'* j' (Kleinbuchstaben!) ** ist **' char', also warum die Besetzung? Und OP druckt nicht "ich". – Olaf

1

Das erste Byte enthält die Darstellung von Bits, die bei Interpretation als Wert vom Typ char einen kleinen negativen Wert ergeben. Dieser Typ wird dann zum Typ int hochgestuft, wenn er an printf übergeben wird. Dann interpretiert printf die Bits der übergebenen Variablen vom Typ int neu, als Typ unsigned int. Diese Bits repräsentieren einen großen Wert.

Typ char wird mit dem Spezifizierer c gedruckt.

Wie auch immer Sie versuchen, ein Byte, nicht ein druckbares Zeichen zu drucken, so sollten Sie den Typ unsigned char und den Spezifizierer verwenden.