Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Использование ptrdiff_t и size_t
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
kolobochishe
Всем доброго дня!

Прочитал тут статью про ptrdiff_t и не очень понял следующего:

Цитата
Тип size_t - базовый беззнаковый целочисленный тип языка Си/Си++. Является типом результата, возвращаемого оператором sizeof. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. Например, на 32-битной системе size_t будет занимать 32-бита, на 64-битной - 64-бита.


и далее следует

Цитата
Тип ptrdiff_t - базовый знаковый целочисленный тип языка Си/Си++. Размер типа выбирается таким образом, чтобы в него можно было записать максимальный размер теоретически возможного массива любого типа. На 32-битной системе ptrdiff_t будет занимать 32-бита, на 64-битной - 64-бита. Как и в size_t в переменную типа ptrdiff_t может быть безопасно помещен указатель


С беззнаковым size_t все понятно. А как в знаковый может быть помещен адрес без каких-либо ограничений. Диапазон то сузился в 2 раза. И даже если этот тип создан для разности двух указателей, то разность будет ограничена не UINT_MAX, а INT_MAX. Может я чего-то не так понимаю? По-моему, ptrdiff_t на 32 разрядной машине должен быть уже 64 разрядным
Эдди
Фактически эта проблема может возникнуть только если приложение больше 2ГБ оперативы захочет выделить себе на 32-битной машине. Что маловероятно. На 64-битной же пока что еще запаса полным-полно!
Хотя, с другой стороны, в одноплатниках вполне может понадобиться использовать и больше 2ГБ в одном приложении (если ресурсы позволяют). И тут может возникнуть проблема. Скорей бы все производители одноплатников перешли на 64-битную архитектуру!
Сергей Борщ
Поэтому "максимальный размер теоретически возможного массива любого типа" на 16-битной платформе - 32767 элементов. На 32-битной, соответственно, 2^31 - 1 элементов.

Цитата(kolobochishe @ Mar 9 2016, 15:31) *
А как в знаковый может быть помещен адрес без каких-либо ограничений. Диапазон то сузился в 2 раза.
Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса.
kolobochishe
Цитата(Сергей Борщ @ Mar 9 2016, 19:37) *
Диапазон остался тем же. Верхняя половина адресов все еще может быть представлена как отрицательные адреса.


Хм.. Действительно. Проверил в MSVS. При дальнейшем использовании в выражении с size_t переменными все приводится правильно и значения верные даже если size_t переменные больше INT_MAX
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.