Рассмотрим этот код:
size_t s = 100000;
Что произойдет, если на платформе, на которой это скомпилировано, тип данных int имеет ширину 16 бит, а тип size_t - 32 бита? Будет ли переменная s содержать значение 100000? Или 100000 будет считаться целым числом, что приведет к переполнению его 16-битного диапазона, что приведет к неопределенному поведению и неопределенному значению к s?
Ответ 1 · рейтинг 3 · R.. GitHub STOP HELPING ICE
Целочисленные литералы всегда имеют тип в соответствии с величиной их значения. Если они десятичные (база 10, как в вашем примере), тип является первым из int, long или long long, способным представлять значение. Если они шестнадцатеричные или восьмеричные, типом является первый из int, unsigned, long, unsigned long, long long или unsigned long long, который может представлять значение.
Таким образом, относительный размер int и size_t на самом деле не имеет отношения к тому, что происходит в вашем вопросе. Пока существует некоторый знаковый тип, в котором может быть представлено 100000 (и C гарантирует, что это так; long должен иметь по крайней мере 32-битный диапазон), литерал имеет правильное значение. При условии, что size_t достаточно велико, чтобы представить это, результирующее значение в s будет 100000. Если size_t меньше, значение будет уменьшено по модулю SIZE_MAX+1.