Это определенно тот случай, когда float
, int
и char
могут иметь разные размеры на разных устройствах, да. Это определяется реализацией вашего компилятора Си. Все, на что вы можете рассчитывать на действительно переносимый код, это:
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long)
И это sizeof(char) == 1
. В C99 есть несколько типов, которые имеют определенный размер битов, и они могут быть вам полезны, если вам нужно сохранить размер типа переносимым от архитектуры к архитектуре.
Редактировать: я посмотрел информацию в спецификации. Раздел 5.2.4.2.1, «Размеры целочисленных типов» - это то, что вы ищете:
... значения, определенные реализацией, должны быть равны или больше по величине (абсолютное значение) показанным ...
UCHAR_MAX 255 // 2^8 - 1
USHRT_MAX 65535 // 2^16 - 1
UINT_MAX 65535 // 2^16 - 1
ULONG_MAX 4294967295 // 2^32 − 1
И так далее ...