2016-02-18 17 views
7

muszę zdefiniować stałe tak:UL sufiks vs uint32_t cast

#define MY_CONSTANT 0xBEEF 

Chcę być pewny, że moja stała będą rozpatrywane 32 bity.

mam może użyć (uint32_t) rzucić tak:

#define MY_CONSTANT (uint32_t)0xBEEF 

Albo przyrostek UL tak:

#define MY_CONSTANT 0xBEEFUL 

Czy te dwie wersje w pełni równoważne?

Powiedziałbym, że nie, ponieważ UL jest odpowiednikiem unsigned long i unsigned long długość może zależeć od procesora.

Standard C99 zapewnia, że ​​liczba całkowita uint32_t wynosi 32 bity, ale uważam, że nie gwarantuje to, że przyrostek UL robi to samo.

+1

'UINT32_C (0xBEEF)'? – EOF

+0

@EOF 'UINT32_C()' upewni się, że typ jest co najmniej 32-bitowy, jak w typie 'uint_least32_t' – chux

+0

Jeśli masz kompilator z 16-bitowym' int', to twoja stała będzie oznaczona jako rozszerzona, gdy nie zostanie oznaczona jako unsigned (lub nastąpi konwersja zdefiniowana przez implementację). Powinieneś użyć przyrostka "U". –

Odpowiedz

4

Masz rację, nie są one równoważne z tego powodu, o którym wspomniałeś. Nie ma gwarancji, że uint32_t jest aliasem dla unsigned long. Jeśli to konieczne, dołącz obsadę do #define.

Powinieneś użyć nawiasów, patrz komentarz @Keith Thompson z bardzo dobrego powodu; w przeciwnym razie sizeof nie będzie działać.

+0

W rzeczywistości w implementacjach 64-bitowych 'unsigned long' jest często 64-bitowe. Zobacz https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models –

+0

Czy należy zdefiniować '((uint32_t) 0xBEEF)' vs '(uint32_t) 0xBEEF'? '()', aby zachować kolejność oceny? – chux

+4

Potrzebujesz nawiasów. Bez nich 'sizeof MY_CONSTANT' rozszerza się do' sizeof (uint32_t) 0xBEEF', który jest błędem składni; nazwa typu parentessowanego jest traktowana jako operand "sizeof". –

1

Sufiks odpowiadający uint32_t niekoniecznie jest UL (zwykle jest to U na architekturach 32-bitowych i 64-bitowych).

Poza tym obsada może w razie potrzeby skrócić stałą całkowitą, która jest szersza, ale odpowiadający jej sufiks nigdy nie będzie odrzucany, tylko w górę.

(Patrz this table jak przyrostków dla stałych całkowitych pracować w różnych bazach.)

+0

Uwaga; 'U' może zwykle być 32-bitowe, ale wiele wbudowanych procesorów używa 16-bitowych' unsigned' w 2017 (100 milionów). – chux

+0

@chux Dzięki. Zmieniono odpowiedź, aby była bardziej przyjazna :). – PSkocik