Мотивация использования size_t uint32 uint64 и т.д.

Когда я читаю некоторый код, для целого числа они используют кучу разного типа, например size_t, uint32, uint64 и т.д. Какова мотивация или цель этого? Почему бы просто не использовать int? Что касается платформы-креста? Или низкий уровень релевантности.

Иногда код имеет смысл для меня, потому что они просто хотят 32 бит int или что-то в этом роде. Но что такое size_t? Пожалуйста, помогите мне сделать это ясно.

Ответ 1

Это для независимости от платформы.

size_t является, по определению, типом, возвращаемым sizeof. Он достаточно велик, чтобы представлять наибольший объект в целевой системе.

Не так много лет назад для любой платформы было бы достаточно 32 бит. Сегодня достаточно 64 бит. Но кто знает, сколько бит понадобится через 5, 10 или 50 лет?

Записывая код не заботясь, т.е. всегда используйте size_t, когда вы имеете в виду "размер объекта", - вы можете написать код, который будет фактически компилироваться и запускаться через 5, 10 или 50 лет. Или, по крайней мере, шанс на бой.

Используйте типы, чтобы сказать, что вы имеете в виду. Если по какой-то причине вам требуется определенное количество бит (возможно, только при работе с внешним форматом), используйте тип размера. Если вы хотите что-то, что является "естественным размером слова машины", то есть быстро использовать int.

Если вы имеете дело с программными типами sizeof или strlen, используйте тип данных, подходящий для этого интерфейса, например size_t.

И никогда не пытайтесь назначать один тип другому, если он не является достаточно большим, чтобы удерживать значение по определению.

Ответ 2

Мотивация их использования заключается в том, что вы не можете полагаться на int, short или long на какой-либо конкретный размер - ошибка, допущенная слишком большим количеством программистов слишком много раз в прошлом. Если вы посмотрите не слишком далеко назад в истории, произошел переход от 16 до 32-битных процессоров, что привело к большому количеству кода, потому что люди ошибочно полагались на int на 16 бит. Та же ошибка была сделана после того, как люди полагались на int на 32 бита и все еще делают это даже по сей день.

Не говоря уже о том, что термины int, short и long действительно были задействованы языковыми дизайнерами, которые все решают сделать их чем-то другим. Программист Java, читающий некоторые C, наивно ожидает, что long будет означать 64 бит. Эти термины действительно бессмысленны - они не указывают ничего о типе, и я сталкиваюсь с каждым лицом, когда я вижу новый язык, выпущенный, который все еще использует термины.

Стандартные типы int были необходимостью, поэтому вы можете использовать тип, который хотите использовать. Они должны были отказаться от int, short и long десятилетий назад.

Ответ 3

Информацию о size_t см. в вопросе о переполнении стека: Что такое size_t в C?

Вы правы для uint32 и uint64, что они просто специфичны в отношении количества бит, которое они хотели бы, и что компилятор должен интерпретировать их как unsigned.

Ответ 4

Существует множество возможных причин выбора базового типа для целочисленного значения. Наиболее очевидным является размер максимально возможного значения, которое вы можете сохранить - uint32 сможет хранить число, вдвое большее, чем int32, что может быть желательно. int64 сможет хранить число, намного большее, чем int32 - до 2 ^ 63 - 1 вместо 2 ^ 31 - 1.

Есть и другие возможные причины. Если вы прямо читаете двоичные данные из какого-либо источника (файла, сокета и т.д.), Необходимо убедиться, что он правильно интерпретирован. Если кто-то пишет uint32 и интерпретирует его как int32, возможно, вы интерпретируете очень большое положительное число как отрицательное число (переполнение).

size_t - это просто typedef для неподписанного int, обычно 32-битного, я считаю.

Ответ 5

Для большинства повседневных программ размер целого не имеет большого значения. Но иногда хорошо быть конкретным. Это особенно полезно для низкоуровневого или встроенного программирования. Другое место, которое полезно, - это научные или вычислительно-интенсивные задачи, где может быть расточительно использовать int, который больше, чем необходимо.

Преимущество size_t заключается в том, что он неподписан. С одной стороны, неплохо использовать size_t, потому что он добавляет больше информации о том, какой должен быть аргумент (т.е. Не negitave). С другой стороны, это меньше привязывает к unsigned int.