#include<stdio.h>
int main(void)
{
signed int a=-1;
unsigned int b=1;
int c= a+b;
printf("%d\n",c);
return 0;
}
В соответствии с правилом преобразования неявного типа, если один операнд unsigned int
, другой будет преобразован в unsigned int
и результат будет в двоичной операции unsigned int
. так здесь b
является unsigned int
, a
должен быть типа отлиты в unsigned int
.Как беззнаковое целочисленное значение всегда анолита, так что значение a
будет 1.so c=1+1=2
.Но на выходе 0
.Как?Неявные преобразования типов
Я считаю, что это поведение, определяемое реализацией (или неопределенным?), Которое вы испытываете. – strager
@strager: да, поведение присвоения 'c' определено реализацией. 6.3.1.3/3: «новый тип подписан, и значение не может быть представлено в нем, либо результат определяется реализацией, либо повышается сигнал, определяемый реализацией». –
Вы оба ошибаетесь. Соответствующее преобразование происходит от подписанного до unsigned, а не без знака для подписания, и поведение корректно определено. '-1' уменьшается по модулю' UINT_MAX + 1', что приводит к 'UINT_MAX', а добавление 1 к этому снова приводит к уменьшению по модулю' UINT_MAX + 1' и, следовательно, 0. Преобразование 0 обратно в подписанный тип затем хорошо определено , –