size_t всегда не подписан?

Я думаю для ответа на этот вопрос, окончательно потребовал бы знания названия компилятора и версии, которую Вы используете и платформа (тип ЦП, ОС и т.д.), что это компилирует для.

58
задан peterchen 6 July 2009 в 20:55
поделиться

5 ответов

Yes. It's usually defined as something like the following (on 32-bit systems):

typedef unsigned int size_t;

Reference:

C++ Standard Section 18.1 defines size_t is in which is described in C Standard as .
C Standard Section 4.1.5 defines size_t as an unsigned integral type of the result of the sizeof operator

49
ответ дан 24 November 2019 в 18:50
поделиться

В соответствии со стандартом ISO C 1999 г. (C99), size_t - это беззнаковый целочисленный тип размером не менее 16 бит (см. Разделы 7.17 и 7.18.3).

Стандарт также рекомендует, чтобы size_t не имел ранга целочисленного преобразования если возможно, больше long , то есть преобразование size_t в unsigned long не представляет проблем, если следовать рекомендациям.

Стандарт ANSI C 1989 года (ANSI C) не упоминается минимальный размер или рекомендуемый уровень преобразования.

Стандарт ISO C ++ 1998 года (C ++ 98) (а также текущий проект для C ++ 0x) относится к стандарту C. Раздел 18.1 гласит:

Содержимое такое же, как заголовок стандартной библиотеки C [...]

Согласно разделу 1.2 это означает, что библиотека определена 1990 стандарт ISO C (C90), ISO / IEC 9899: 1990 и пункт 7 ISO / IEC 9899 / Amd.1: 1995 в дальнейшем называется стандартной библиотекой C .

Части, относящиеся к size_t , должны быть унаследованы от ANSI C: Frontmatter и нумерация разделов в сторону, стандарты для C90 и ANSI C идентичны. Мне нужна копия нормативной поправки, чтобы быть уверенным, что в stddef.h не было соответствующих изменений, но я сомневаюсь в этом. Минимальный размер, по-видимому, вводится с помощью stdint.h , то есть C99.

Также обратите внимание на следующую цитату из раздела 1.2 C ++ 98:

Все стандарты подлежат пересмотру, и стороны договоров, основанных на этот международный стандарт призван исследовать возможность применения максимально последние редакции стандартов указано ниже.

51
ответ дан 24 November 2019 в 18:50
поделиться

Yes, size_t is guaranteed to be an unsigned type.

14
ответ дан 24 November 2019 в 18:50
поделиться

В соответствии со стандартом он беззнаковый, однако я помню, что в некоторых старых реализациях для typedef использовался подписанный тип.

Из более старого документа GCC:

Существует потенциальная проблема с типом size_t и версиями GCC до выпуска 2.4. ANSI C требует, чтобы size_t всегда был беззнаковым. Для совместимости с заголовочными файлами существующих систем GCC определяет size_t в stddef.h как любой системный sys / types. h определяет это как быть. Большинство систем Unix, которые определяют size_t в sys / types.h , определяют его как знаковый тип. Некоторый код в библиотеке зависит от того, что size_t является беззнаковым типом, и не будет работать правильно, если он подписан

Я не уверен, насколько важно было бы защититься от этого. В моем коде предполагается, что он беззнаковый.

5
ответ дан 24 November 2019 в 18:50
поделиться

size_t должно соответствовать тому же определению, что и стандарт C, 4 The macro NULL is an implementation-defined C++ null pointer constant in this International Standard (4.10).

The macro offsetof accepts a restricted set of type arguments in this International Standard. type shall be a POD structure or a POD union (clause 9). The result of applying the offsetof macro to a field that is a static data member or a function member is undefined. SEE ALSO: subclause 5.3.3, Sizeof, subclause 5.7, Additive operators, subclause 12.5, Free store, and ISO C subclause 7.1.6.

2
ответ дан 24 November 2019 в 18:50
поделиться
Другие вопросы по тегам:

Похожие вопросы: