2017-02-08 2 views
2

eine große Zahl zu unsigned int zu. Ich versuche, unsigned int eine Zahl zuzuweisen, aber es führt zu einem Fehler. Ich dachte, solange die Zahl zwischen 0 und 2^32 liegt, sollte es funktionieren. Hier ist mein Code.Weisen Sie in C

unsigned int number = 4026658824; 

Allerdings bekomme ich diesen Fehler.

error: constant promoted according to the 1999 ISO C standard

+4

'unsigned int' liegt im Bereich [0, 2^32-1]. –

+0

Was ist Ihre Plattform? – LPs

+1

@YuriyIvaskevych Ja, was? Das Problem bezieht sich nicht auf unsigned int, aber auf die Regeln für welchen Typ der Compiler für eine Integer-Konstante wählt. Eine bessere Compiler-Warnung wäre gewesen: "warning: implizite Konvertierung von long int in unsigned int". – Lundin

Antwort

0

Zusätzlich zu den Antworten oben, wenn Sie eine Variable wollen, Fixed-width integer types eine bestimmte Anzahl von Bits, die auf jeden Fall sein, verwenden. Beim Embedded Work müssen wir vorsichtig sein (CPU kann nur 8 oder 16 Bit sein), also benutze sie immer für alles.

+1

Obwohl gute Beratung, das beantwortet nicht wirklich die Frage. 'uint32_t number = 4026658824;' hätte die gleiche Diagnose gestellt. Um die Diagnose zu umgehen, indem Sie stdint-Typen verwenden, müssten Sie 'uint32_t number = UINT32_C (4026658824) schreiben;' – Lundin

+0

Daher "In ** zusätzlich zu ** den Antworten oben ..." –

5

Art der Dezimalkonstante hängt von der Art, in der sie dargestellt werden kann, je 6.4.4.1 Integer constants:

The type of an integer constant is the first of the corresponding list in which its value can be represented.

(die Tabelle in dem Link für Sie, wie C-Sprache sagt die tatsächliche Art von Integer-Konstanten ist abgeleitet).

In der Regel kann ein vorzeichenbehafteter int den Wert 4026658824 nicht darstellen. Also, 4026658824 hat wahrscheinlich Typ long int oder long long int auf Ihrem System. Wenn unsigned int kann 4026658824 darstellen, dann ist das in Ordnung, aber Ihr Compiler ist vorsichtig.

Sie könnten u oder U Suffix verwenden oder es zu unsigned int umwandeln. Das Suffix u funktioniert möglicherweise nicht, wenn die Ganzzahlkonstante einen größeren Wert hat. Beispiel: Wenn 17179869184u nicht durch unsigned int dargestellt werden kann, kann der Typ unsigned long int oder unsigned long long int lauten, und Sie erhalten möglicherweise trotzdem eine Diagnose.

+0

Ich wünschte, es gäbe einen Weg, um sicherzustellen, dass der Typ der Variablen identisch mit dem Typ des Literals ist. GCC hat' typeof', das Sie in ein Makro einfügen können, aber es ist nicht standard :(. – StoryTeller

+0

@StoryTeller, besser, den Zieltyp entsprechend den Anforderungen Ihres Programms zu wählen und die Konstante für den gewünschten Typ entsprechend auszudrücken Der Standard hat spezifische [Regeln dafür, wie der Typ einer Integer-Konstante bestimmt wird] (http: // port70.net/~nsz/c/c11/n1570.html#6.4.4.1p5). –

+0

@StoryTeller, und wenn die Bedürfnisse des Programms durch den Wert der Konstante bestimmt werden, dann hat C explizite Breite und minimale Beispielsweise könnte man die Variable als 'uint_least32_t' deklarieren (aus 'stdint.h'). Das ändert nichts an der Notwendigkeit, Konstanten in einer geeigneten Form auszudrücken. –

Verwandte Themen