Уменьшение size_t справа от присваивания - PullRequest
1 голос
/ 10 апреля 2020

Почему idx1 -1 в этом случае?

long long idx = (size_t)0 - 1;

cout << (size_t)0 - 1; Это печатает ULLONG_MAX

cout << idx; Это печатает -1

Что изменится, если вместо idx будет целое число?

1 Ответ

1 голос
/ 10 апреля 2020

В этом операторе

cout << (size_t)0 - 1;

тип выражения (size_t)0 - 1 является целым типом без знака size_t из-за обычных арифметических c преобразований. Поскольку он не может быть отрицательным, он имеет значение ULLONG_MAX (кажется, что в используемой системе тип size_t определен как псевдоним для типа unsigned long long int).

В этом объявлении

long long idx = (size_t)0 - 1;

инициализатор преобразуется в тип long со знаком long long int, то есть в тип объявленного объекта. Значение UNIT_MAX не может вписаться в длинную строку со знаком , поэтому оно дает значение -1. ​​

Поскольку ширина типа size_t в используемой системе равна ширине типа введите long long int. Таким образом, внутреннее представление инициализатора типа size_t интерпретируется как значение типа long long. Наиболее значимый бит беззнакового инициализатора рассматривается как знак bit.int.

...