Присвоение size_t, когда int меньше, чем size_t

Рассмотрим этот код:

size_t s = 100000;

Что произойдет, если на платформе, на которой это скомпилировано, тип данных int имеет ширину 16 бит, а тип size_t — 32 бита? Будет ли переменная s содержать значение 100000? Или 100000 будет считаться целым числом, что приведет к переполнению его 16-битного диапазона, что приведет к неопределенному поведению и неопределенному значению к s?


person Martin Heralecký    schedule 23.02.2019    source источник
comment
Ваш вопрос не имеет ничего общего с size_t и связан с тем, как компилятор обрабатывает целое число буквально?   -  person paulsm4    schedule 23.02.2019


Ответы (1)


Целочисленные литералы всегда имеют тип в соответствии с величиной их значения. Если они десятичные (база 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.

person R.. GitHub STOP HELPING ICE    schedule 23.02.2019
comment
Целые литералы всегда имеют тип в соответствии с величиной их значения. И как это работает с литералами и арифметическими операциями? Например, если int равно 16b, имеет ли этот 1000 * 1000 значение 1000000 как long? - person Martin Heralecký; 23.02.2019
comment
@MartinHeralecký: здесь задействованы литералы 1000 и 1000, каждый из которых имеет тип int. Они являются операндами в выражении с использованием оператора *. Предполагая 16-битное int, это переполняется. - person R.. GitHub STOP HELPING ICE; 23.02.2019
comment
Спасибо за ваше объяснение. - person Martin Heralecký; 23.02.2019