Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Should I use the stdint.h integer types on 32/64 bit machines?

One thing that bugs me about the regular c integer declarations is that their names are strange, "long long" being the worst. I am only building for 32 and 64 bit machines so I do not necessarily need the portability that the library offers, however I like that the name for each type is a single word in similar length with no ambiguity in size.

// multiple word types are hard to read
// long integers can be 32 or 64 bits depending on the machine

unsigned long int foo = 64;
long int bar = -64;

// easy to read
// no ambiguity

uint64_t foo = 64;
int64_t bar = -64;

On 32 and 64 bit machines:

1) Can using a smaller integer such as int16_t be slower than something higher such as int32_t?

2) If I needed a for loop to run just 10 times, is it ok to use the smallest integer that can handle it instead of the typical 32 bit integer?

for (int8_t i = 0; i < 10; i++) {

}

3) Whenever I use an integer that I know will never be negative is it ok to prefer using the unsigned version even if I do not need the extra range in provides?

// instead of the one above
for (uint8_t i = 0; i < 10; i++) {

}

4) Is it safe to use a typedef for the types included from stdint.h

typedef int32_t signed_32_int;
typedef uint32_t unsigned_32_int;

edit: both answers were equally good and I couldn't really lean towards one so I just picked the answerer with lower rep

like image 910
YeOldeBitwise Avatar asked Jan 04 '23 05:01

YeOldeBitwise


1 Answers

1) Can using a smaller integer such as int16_t be slower than something higher such as int32_t?

Yes it can be slower. Use int_fast16_t instead. Profile the code as needed. Performance is very implementation dependent. A prime benefit of int16_t is its small, well defined size (also it must be 2's complement) as used in structures and arrays, not so much for speed.

The typedef name int_fastN_t designates the fastest signed integer type with a width of at least N. C11 §7.20.1.3 2


2) If I needed a for loop to run just 10 times, is it ok to use the smallest integer that can handle it instead of the typical 32 bit integer?

Yes but that savings in code and speed is questionable. Suggest int instead. Emitted code tends to be optimal in speed/size with the native int size.


3) Whenever I use an integer that I know will never be negative is it OK to prefer using the unsigned version even if I do not need the extra range in provides?

Using some unsigned type is preferred when the math is strictly unsigned (such as array indexing with size_t), yet code needs to watch for careless application like

for (unsigned i = 10 ; i >= 0; i--) // infinite loop

4) Is it safe to use a typedef for the types included from stdint.h

Almost always. Types like int16_t are optional. Maximum portability uses required types uint_least16_t and uint_fast16_t for code to run on rare platforms that use bits widths like 9, 18, etc.

like image 160
chux - Reinstate Monica Avatar answered Feb 02 '23 00:02

chux - Reinstate Monica