Стандарты ничего не говорят о точном размере любых целых чисел, кроме char
. Как правило, long
является 32-разрядной в 32-разрядных системах и 64-разрядной в 64-разрядных системах.
В стандарте, однако, указывается минимум. Из раздела 5.2.4.2.1 части C Standard:
Значения, приведенные ниже, должны быть заменены постоянными выражениями , пригодных для использования в #if
директив предварительной обработки. Кроме того, за исключением CHAR_BIT
и MB_LEN_MAX
, следующее должно быть заменено выражениями того же типа, что и выражение , которое является объектом соответствующего типа, преобразованного в соответствии с целыми акциями. Значения, определяемые реализацией , должны быть равны или больше по величине (по абсолютной величине) до с указанными знаками.
...
минимальное значение для объекта типа long int
LONG_MIN
-2147483647 // - (2^31-1)
максимальное значение для объекта от long int
LONG_MAX
+2147483647 // 2^31-1
Это говорит о том, что long int
должен быть минимум 32 бит, но может быть больше. На машине, где CHAR_BIT
равно 8, это дает минимальный размер байта 4. Однако на машине, например. CHAR_BIT
, равный 16, a long int
может составлять 2 байта.
Вот пример реального мира.Для следующего кода:
#include <stdio.h>
int main()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Выход на Debian 7 i686:
SizeOf (длинный) = 4
Выход на CentOS 7 x64:
SizeOf (длинный) = 8
Итак, нет, вы не можете делать никаких предположений о размере. Если вам нужен тип определенного размера, вы можете использовать типы, определенные в stdint.h
. Он определяет следующие типы:
int8_t
: подписан 8-битный
uint8_t
: беззнаковое 8-битный
int16_t
: подписан 16-битный
uint16_t
: беззнаковое 16-битное
int32_t
: подписанный 32-разрядный
uint32_t
: unsigned 32-bit
int64_t
: подписан 64-бит
uint64_t
: беззнаковое 64-разрядное
Заголовок stdint.h
описано в разделе 7.20 стандарта, с точными типами ширины в разделе 7.20.1.1. В стандарте указано, что эти typedef являются необязательными, но они существуют в большинстве реализаций.
Просто напомните вам, что 'sizeof' учитывает отступы и выравнивание. Он соответствует стандарту 'sizeof (unsigned long)' из 8 байтов, но переполнение ведет себя как 4 байта. Это неправильно, если вы пытаетесь использовать 'sizeof' и' CHAR_BITS' для вычисления предела целочисленного типа. Используйте 'limits.h', когда он должен использоваться. – user3528438
Вы действительно должны прочитать (сокращенную первую, а затем полную версию) C-faq, которая возникла в Usenet в то время, когда это было * место, где люди, обладающие знаниями по предмету, собрались в одном и том же месте (теперь, он широко распространен среди нескольких сайтов ...), и поэтому он привел к невероятным результатам и хорошо выполненным часто задаваемым вопросам. См. Http://c-faq.com/versions.html. Чтение - это открывающий глаза на этот вопрос, и на десятки больше вы, вероятно, даже не знаете, о чем вам нужно знать (раздел 5 - нулевые указатели - это тот, который содержит часто задаваемые вопросы, которые я был шокирован (и благодарен)) –
нет, это 8 на моем компьютере – RiaD