Ответ 1
В C89, size_t
определяется как целое число без знака. В отличие от будущих стандартов, C89 определяет, что представляет собой список беззнаковых целочисленных типов:
- unsigned char
- unsigned short
- unsigned int
- unsigned long
Таким образом, size_t
в C89 никогда не будет больше, чем unsigned long
, и поэтому литье всегда безопасно - и в том, что оно не вызовет никакого поведения undefined и в том, что оно всегда будет достаточно большим, чтобы удерживайте значение целиком.
Стоит отметить; стандарт C89 гласит: "Соответствующая реализация может иметь расширения (включая дополнительные библиотечные функции) при условии, что они не изменят поведение любой строго соответствующей программы" Это означает, что никакое расширение не может изменить это поведение - при этом все еще соответствует стандарту C89, поскольку неподписанные целые типы были специально перечислены и поэтому не могут быть изменены.
В будущих стандартах это не является гарантией, и пока вы не получите поведение undefined - вы можете потерять данные, где unsigned long
меньше, чем size_t
, что означает, что вы будете показывать неверные данные своему пользователю. В этой ситуации я бы не стал называть его "безопасным".
В качестве важной дополнительной заметки этот ответ относится к компиляторам, которые соответствуют стандарту C89. Возможно, ваш компилятор C89 будет "менее совместимым" в отношении вышеизложенного, и в этом случае - считайте, что поведение похоже на поведение на C99 или новее, где вы не увидите поведение undefined, но могут пострадать от потери данных если size_t
больше, чем unsigned long
. Чтобы быть ясным, это не соответствовало бы стандарту C89.
Помимо этого, хотя моя интерпретация стандарта (1.7 Compliance) заключается в том, что, хотя он утверждает, что расширения не должны изменять поведение "строго соответствующей программы" и, как таковое, не могут изменить тот факт, что size_t
должен быть unsigned long
по большей мере без соблюдения; это не меняет того факта, что такие расширения существуют. Например, GNU GCC предоставляет расширение, которое добавляет unsigned long long
. На мой взгляд, это несоответствие, но на самом деле вы должны быть готовы справиться с такими вещами и как таковыми - , в то время как стандарт говорит, что вы делаете, полностью безопасен, вы должны быть готовы к потенциальной потере данных, несовместимые компиляторы или расширения используются.
Пожалуйста, смотрите здесь, чтобы обсудить эту тему: fooobar.com/questions/848639/...