2013-11-01 2 views
46

Я так растерялся о size_t. Я искал в Интернете и везде упоминал, что size_t является неподписанным типом, поэтому он может представлять неотрицательное значение.Разница между size_t и unsigned int?

Мой первый вопрос: если он используется для представления не отрицательных значений, почему бы нам не использовать unsigned int вместо size_t?

Мой второй вопрос: есть size_t и unsigned int взаимозаменяемые или нет? Если нет, то почему?

И может ли кто-нибудь дать мне хороший пример size_t и его краткую работу?

+3

'ЬурейеЙ/* Эта часть зависит от реализации */size_t; ' – P0W

+2

Возможный дубликат [unsigned int vs. size \ _t] (http://stackoverflow.com/questions/131803/unsigned-int-vs-size-t) –

ответ

44

если использовать для представления неотрицательного значения, так почему мы не используем unsigned int вместо size_t

Поскольку unsigned int не только без знака интеграла типа. size_t может быть любым из unsigned char, unsigned short, unsigned int, unsigned long или unsigned long long, в зависимости от реализации.

Второй вопрос заключается в том, что size_t и unsinged int взаимозаменяемы или нет, и если нет, то почему?

Они не являются взаимозаменяемыми по причине, описанной выше ^^.

И может ли кто-нибудь дать мне хороший пример size_t и его краткой работы?

Я не совсем понимаю, что вы подразумеваете под его «краткой работой». Он работает как любой другой неподписанный тип (в частности, как и тип, на который он набирается). Вам рекомендуется использовать size_t, когда вы описываете размер объекта. В частности, оператор sizeof и различные стандартные библиотечные функции, такие как strlen(), возвращают size_t.

Бонус: here's a good article (статья удалена, используйте wayback machine snapshot) о size_t (и тесно связанные ptrdiff_t типа). Он очень хорошо объясняет, почему вы должны его использовать.

6

size_t имеет специальное ограничение.

Цитируя http://www.cplusplus.com/reference/cstring/size_t/:

Псевдоним одного из основных беззнаковых целых типов.

Это тип, который может представлять размер любого объекта в байтах.: size_t - это тип, возвращаемый оператором sizeof и широко используемый в стандартной библиотеке для представления размеров и подсчетов.

Это не взаимозаменяемы с unsigned int, так как размер int определяется моделью данных. Например, LLP64 использует 32-разрядный int, а ILP64 использует 64-разрядный int.

+3

Где эта цитата? (Это не со стандарта C.) –

+0

@KeithThompson http://www.cplusplus.com/reference/cstring/size_t/ –

+0

Вопрос помечен тегом [tag: c]. Стандарт C++ не имеет отношения к C. – IInspectable

3

size_t используется для хранения размеров объектов данных и гарантированно может содержать размер любого объекта данных, который может создать конкретная реализация C. Этот тип данных может быть меньше (в количестве бит), больше или точно такой же, как unsigned int.

24

Есть 5 стандартных типов целое число без знака в C:

  • unsigned char
  • unsigned short
  • unsigned int
  • unsigned long
  • unsigned long long

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

size_t является typedef (то есть, псевдоним) для некоторого типа без знака, (вероятно, один из указанного выше, но, возможно, расширенных целого числа без знака типа, хотя это маловероятно). Это тип, который дает оператор sizeof.

В одной системе может иметь смысл использовать unsigned int для представления размеров; на другом, возможно, имеет смысл использовать unsigned long или unsigned long long. (size_t вряд ли будет либо unsigned char, либо unsigned short, но это разрешено).

Цель size_t - избавить программиста от необходимости беспокоиться о , который предопределенных типов используется для представления размеров.

Код, который предполагает, что sizeof дает unsigned int, не был бы переносимым. Код, который предполагает, что он дает size_t, скорее всего, будет переносимым.

+1

Я думаю, что это должен быть принятый ответ, потому что он объясняет, почему вы должны использовать size_t – kuchi

3

size_t type - базовый беззнаковый целочисленный тип Язык C/C++. Это тип результата , возвращаемый оператором sizeof. Размер этого типа составляет , поэтому он может хранить максимальный размер теоретически возможного массива любого типа. На 32-разрядная система size_t будет принимать 32 бита, бит 64- бит 64 бит. Другими словами, переменная типа size_t может безопасно хранить указатель. Исключением являются указатели на функции класса, но этот является специальным случаем. Хотя size_t может хранить указатель , для этой цели лучше использовать другой беззнаковый тип uintptr_t (его имя отражает его возможности). Типы size_t и uintptr_t являются синонимами. size_t type is обычно используется для счетчиков циклов, индексации массива и адресной арифметики. Максимально возможное значение типа size_t равно константа SIZE_MAX.

+0

'size_t' может хранить размер любого отдельного объекта. Указатель может указывать на любой байт любого объекта. У вас может быть система с, например, 64-разрядным адресным пространством, которое ограничивает размер любого одного объекта 2 ** 32-1 байтами. Нет гарантии, что 'size_t' и' uintptr_t' будут одного типа. –

1

Помимо других ответов также документы код и говорит людям, что вы говорите о размерах объектов в памяти

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