Может ли кто-нибудь объяснить вывод следующего оператора в C? - PullRequest
0 голосов
/ 07 августа 2020

Я запускаю следующий код на своей консоли, но не могу понять этот вывод? Почему эта программа не выдает ошибку, а вместо этого выводит значение?

#include<stdio.h>
int main()
{
  unsigned int a = -1;
   printf("%u",a);
}

Вывод: 4294967295

1 Ответ

3 голосов
/ 07 августа 2020

Я не могу понять этот вывод?

Значение signed int -1 равно преобразовано в unsigned int. Из C11 6.3.1.3p2 при преобразовании значения со знаком в «новый тип», который равен unsigned int (вы можете найти страницу неявных преобразований cppreference более доступной):

Когда значение с целочисленным типом преобразуется в другой целочисленный тип, отличный от _Bool, если значение может быть представлено новым типом, оно не изменяется.

В противном случае, если новый тип без знака, значение преобразуется путем многократного добавления или вычитания на единицу большего, чем максимальное значение, которое может быть представлено в новом типе, до тех пор, пока значение не окажется в диапазоне нового типа.

Итак -1 не представляется в unsigned int. Поэтому мы должны прибавить или вычесть UINT_MAX+1 к этому значению, чтобы получить что-то, что можно представить в unsigned int. Итак, мы добавляем UINT_MAX+1 к -1, предполагая, что на вашей платформе UINT_MAX равно 4294967295, мы получаем UINT_MAX + 1 - 1 = 4294967295. Отлично, теперь значение представлено в unsigned int, и это значение присвоено.

Почему эта программа не выдает ошибку

Потому что C - это слабо типизированный язык в случае целочисленных типов и неявных преобразований между некоторыми типами - это всего лишь часть языка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...