2014-03-19 3 views
26

Я знаю в C Тип возврата sizeof Оператор size_t является неподписанным целым числом, определенным в <stdint.h>. Это означает, максимальный размер его должен быть 65535, как указано в C99 стандартной 7.18.3:Максимальный размер size_t

limit of size_t 
    SIZE_MAX    65535 

Однако в gcc-4.8.2 заголовочный файл stdint.h определил его размер значительно больше, чем 65535 противоречащим который заявлен в C99 стандарта, как показано ниже показано,

/* Limit of `size_t' type. */ 
# if __WORDSIZE == 64 
# define SIZE_MAX    (18446744073709551615UL) 
# else 
# define SIZE_MAX    (4294967295U) 
# endif 

Просьба помочь мне понять, почему существует какая-то разница или причина моего неправильного толкования.

+0

Извините за непреднамеренное понижение - мои щелканные пальцы неуклюжи. –

+0

[Как получить SIZE_MAX в C89] (https://stackoverflow.com/q/44401965/995714) –

ответ

34

Стандарт говорит, что SIZE_MAX должен быть по крайней мере 65535.

Он не указывает на отсутствие верхней границы, и реализация ССЗ вполне допустимо.

Цитирование ссылку вы цитируемое (курсив):

его реализации, определенное значение должно быть равна или больше по величине (абсолютное значение), чем соответствующее значение, указанное ниже, с тем же знаком ,

+0

Теперь это имеет смысл. 'SIZE_MAX 65535' - это минимальный предел, который меня путал с' пределом size_t', считая его максимальным. Спасибо –

+4

@SunEric: Правильно, '65535' - минимальный максимум. –

+1

Подозреваемый 'SIZE_MAX' верхний предел' UINTMAX_MAX'. – chux

-5

Я хотел бы предложить бросок в настоящее время по величине (без знака), как в:

#define SIZE_T_MAX size_t(0xffffffffffffffffULL) 

Это должно дать соответствующие результаты как для 32 бит и 64 бит компиляции.

+5

Зачем? 'SIZE_MAX' уже определен в' '; совершенно не нужно переопределять его самостоятельно. Если вам нужно иметь дело с реализациями pre-C99, которые не предоставляют '', вы можете использовать '((size_t) -1)', что гарантированно даст наибольшее значение типа 'size_t'. О, и это неправильный синтаксис для трансляции. –

+1

Вы правы. Я все еще работал над тем, что у меня нет stdint.h. – Jan

+2

Возможно, вы удалите свой ответ. Если ничего другого, вы вернете очки репутации, которые вы потеряли из downvotes. –

Смежные вопросы