2016-06-02 5 views
0

Ich mag würde unsigned short verstehen, warum Überlauf des Ausgangs Show für, aber nicht für unsigned long? Hier ist ein Beispiel?C Ausgang nicht Überdruck

#include <stdio.h> 
#include <stdlib.h> 

unsigned short us(float s); 
unsigned long ul(float l); 
float a = -10; 
int main() 
{ 
    printf("us method return: %d ", us(a)); 
    printf("\nul method return: %d ", ul(a)); 
    return 0; 
} 

unsigned short us(float s) 
{ 
    return (s + 1); 
} 
unsigned long ul(float l) 
{ 
    return (l + 1); 
} 

Und der Ausgang ist:

us method return: 65527 
ul method return: -9 
+3

Funktioniert, wenn Sie korrekte Druckspezifizierer verwenden: https://ideone.com/STzIMN – 2501

+0

Verwenden Sie '% u' für unsigned int und'% lu' für unsinged lang. Hier einige Formatierung: http://www.tutorialspoint.com/c_standard_library/c_function_printf.htm – duncan

+1

Verwenden ' "% hu"' wie bei 'printf ("uns Methode Rückkehr:% hu \ n", uns (a)); ' – chux

Antwort

2

%d erwartet das Argument int vom Typ zu sein.

printf() einer Variadische Funktion sind, sind die ganzzahligen Promotions auf jedes Argument durchgeführt.

Sobald Sie eine unsigned short bieten, kann es zu int gefördert werden, aber unsigned long (in höheren Rang ist als int) kann nicht sein zu int gefördert, damit Sie am Ende falsche Art von Argument %d welche Versorgung nach oben wird aufrufen undefined behavior .

sollten Sie %lu verwenden, um einen unsigned long Wert zu drucken.

+0

dank für die wertvollen Informationen. Aber, warum sollte es nicht max int ausdrucken (in der Bezeichnung von% d) Überlauf zu zeigen, für den unsigned long Fall und es kann nur drucken, max int? – CB4