В качестве заголовка: является size_t всегда без знака, то есть для size_t x
, является x
всегда >= 0
?is size_t всегда без знака?
ответ
Да. Это обычно определяется как нечто вроде следующего (на 32-разрядных системах):
typedef unsigned int size_t;
Ссылка:
C Стандартная секция ++ 18.1 определяет size_t
в <cstddef>
, который описан в C стандарта, как <stddef.h>
.
C Стандарт Раздел 4.1.5 определяет size_t
как беззнаковое интегрального типа результата sizeof
оператора
@Neil: Я знаю. Это было первое, что я нашел. У меня нет стандарта C++ под рукой, поэтому я загружаю его (моя связь проклята медленно). Тем временем я ставил что-то другое, кроме меня. –
Ну, у меня есть стандарт C++, но не могу найти его, возможно, потому, что он фактически определен в стандарте C (не C99). Я надеюсь, что кто-то отследит его, потому что я думаю, что это интересный вопрос! – 2009-07-06 21:12:42
Имейте в виду, что cplusplus.com имеет некоторые странные сайты. Посмотрите на это, например: http://www.cplusplus.com/reference/iostream/ostream/operator%3C%3C/, которые теперь являются интересными сигнатурами оператора <<: –
Да, size_t гарантирует, что будет неподписанным.
В соответствии со стандартом 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
<stddef.h>
[...]
В соответствии с разделом 1.2, это означает, библиотеку, как определено стандартом ISO C 1990 (С90), в том числе его первой поправки от 1995 (C95):
библиотека описано в пункте 7 ISO/IEC 9899: 1990 и пункта 7 ISO/IEC 9899/Amd.1: 1995 является в дальнейшем call ed Стандартная библиотека C.
Детали относительно size_t
должен быть унаследован от ANSI C: Frontmatter и раздел нумерации в сторону, стандарты C90 и ANSI C идентичны. Мне нужна копия нормативной поправки, чтобы быть уверенным, что никаких изменений в stddef.h
не было, но я сомневаюсь. Минимальный размер вводится с stdint.h
, т.е. C99.
Также просьба рассмотреть следующую цитату из раздела 1.2 из C++ 98:
Все стандарты подлежат пересмотру, и сторонам соглашений, основанных на настоящего стандарта рекомендуется изучить возможность применения наиболее последних изданий стандартов указанных ниже.
К сожалению, вопрос касается не C99, а C++. – 2009-07-06 21:08:33
@Neil, ну он должен взять C-стандарт, потому что C++ Standard делегирует ему :) Он сам не определяет size_t :) –
Да, но стандарт C++ не ссылается на стандарт C99. – 2009-07-06 21:13:30
В соответствии со стандартом он неподписан, однако я помню, что некоторые старые реализации использовали тип подписанного типа для 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
быть без знака типа, и не будет работать правильно, если он подписан
Я не уверен, насколько важно было бы, чтобы защититься от этого. Мой код предполагает, что он неподписан.
Я думаю, что все знают, что это, вероятно, без знака - но если кто-то не может процитировать соответствующий документ стандартов, мы никогда не узнаем наверняка. – 2009-07-06 21:10:34
У меня нет стандартного документа, доступного на данный момент (хотя я уверен, что все соответствующие стандарты C90, C99 и C++ 98 и выше требуют, чтобы он был без знака). Однако я просто хотел указать, что независимо от стандарта существуют потенциально важные исключения, когда size_t является подписанным типом. –
Размер_t должен соответствовать тому же определению, что и стандарт C, и в нескольких местах в стандарте C++ подразумевается, что это nigned noigned natura (особенно в определениях аргументов шаблона распределителя).
В стандарте C++, раздел 18.1 (ISO/IEC 14882 - Первое издание 1998-01-01):
В таблице 15 перечислены типы, как определено: ptrdiff_t и size_t
3 Содержание являются одинаковыми в качестве заголовка библиотеки Standard C со следующими изменениями: 4 Макрос NULL представляет собой константу нулевого указателя C++, определенную реализацией, в этом Международном стандарте (4.10).
В этом международном стандарте макрос offsetof принимает ограниченный набор аргументов типа. тип должен быть структурой POD или объединением POD (раздел 9). Результат применения макроса offsetof к полю, который является членом статических данных или членом функции, не определен. СМ. ТАКЖЕ: подпункт 5.3.3, «Размер», подпункт 5.7, «Аддитивные» операторы, подраздел 12.5, «Свободное хранилище» и ISO С подпункт 7.1.6.
О, это просто ужасно:
vector<MyObject> arr;
Fill(arr);
size_t size = arr.size();
for(size_t i = 1; i < size - 1; ++i)
{
auto obj = arr[i];
auto next = arr[i+1];
}
Теперь рассматривают случай, когда использование обр пусто.
Некоторые цитаты из документа стандартов для всех утверждений ниже были бы хороши. – 2009-07-06 21:01:36
Это не размер, как вы его используете :) – ralphtheninja
Существует «ssize_t» для «подписанного size_t» :) –