В этом операторе
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.