4.4.1 Hexadecimal and Binary Integer Constants

The use of hexadecimal or binary notation to define a number will automatically create an unsigned integer using a representation that is just large enough to hold the specified value. For example:

0b101        # uint8
0x100        # uint16
0xDEADBEEF   # uint32
0x1DEADBEEF  # uint64

The storage class can be specified by adding a suffix. Use ‘s’ for signed integers and ‘u’ for unsigned integers along with a size (‘8’, ‘16’, ‘32’, ‘64’). The use of the underscore separator ‘_’ can improve readability. For example:

0b101s16        # int16
0b101_s16       # int16, value and representation separated
0xDEADBEEFs32   # int32
0xDEADBEEF_u64  # uint64

Note that when defining matrices of integer constants the overall matrix will have the storage class of its first element. The matrix [0x1; 0x100; 0x10000] will be of type uint8 and the larger values will be truncated because of the saturation semantics of integer values. To avoid this issue either: 1) declare the first integer to be of the desired size such as 0x1u32; 0x100; 0x10000], or 2) pad constants in array expressions with leading zeros so that they use the same number of digits for each value such as [0x00_00_01; 0x00_01_00; 0x01_00_00].