2016-02-18 6 views
7

Ich habe Konstanten wie folgt zu definieren:UL Suffix vs uint32_t werfen

#define MY_CONSTANT 0xBEEF 

ich sicher sein will, dass mein Konstante 32 Bit betrachtet werden.

Ich habe können (uint32_t) verwenden werfen wie folgt aus:

#define MY_CONSTANT (uint32_t)0xBEEF 

oder eine UL-Suffix wie folgt aus:

#define MY_CONSTANT 0xBEEFUL 

Sind diese beiden Versionen völlig gleichwertig?

Ich würde sagen nein, wie UL entspricht unsigned long und unsigned long Länge kann von CPU abhängen.

Der C99-Standard stellt sicher, dass eine uint32_t integer 32 Bit ist, aber ich glaube nicht, es wird sichergestellt, dass ein UL Suffix das gleiche tut.

+1

'UINT32_C (0xBEEF)'? – EOF

+0

@EOF 'UINT32_C()' stellt sicher, dass der Typ _at mindestens_ 32 Bit ist, wie im Typ 'uint_least32_t' – chux

+0

Wenn Sie einen Compiler mit einem 16-Bit' int' haben, wird Ihre Konstante erweitert, wenn sie nicht als vorzeichenlos markiert ist (oder eine implementierungsdefinierte Konvertierung wird stattfinden). Sie sollten ein "U" -Suffix verwenden. –

Antwort

4

Sie haben Recht, sie sind nicht gleichbedeutend mit dem Grund, den Sie erwähnen. Es gibt keine Garantie dafür, dass uint32_t ein Alias ​​für unsigned long ist. Nehmen Sie den Guss bei Bedarf in die #define s.

Sie sollten die Klammern verwenden, siehe Kommentar von @Keith Thompson aus einem sehr guten Grund, warum; sonst wird sizeof nicht funktionieren.

+0

In 64-Bit-Implementierungen ist "unsigned long" oft 64-Bit. Siehe https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models –

+0

Sollte die Definition '((uint32_t) 0xBEEF)' vs '(uint32_t) 0xBEEF' sein? '()' um die Bewertungsreihenfolge zu bewahren? – chux

+4

Sie benötigen Klammern. Ohne sie wird "sizeof MY_CONSTANT" auf "sizeof (uint32_t) 0xBEEF" erweitert, was ein Syntaxfehler ist; Der Name des eingeklammerten Typs wird als der Operand der "Größe von" genommen. –

1

Das Suffix entsprechend uint32_t ist nicht notwendigerweise UL (es ist normalerweise U auf 32-Bit- und 64-Bit-Architekturen).

Abgesehen davon könnte ein Cast möglicherweise eine Integer-Konstante abschneiden, die breiter ist, aber das entsprechende Suffix würde niemals abstürzen, sondern nur nach oben.

(Siehe this table für wie Suffixe in verschiedenen Basen mit ganzzahligen Konstanten arbeiten.)

+0

Hinweis; Ein "U" kann normalerweise 32 Bit sein, aber viele eingebettete Prozessoren verwenden 16 Bit "unsigned" im Jahr 2017 (100 Millionen). – chux

+0

@chux Danke. Bearbeitete die Antwort, um es umfassender zu machen :). – PSkocik