Я провел несколько тестов в VC++2010, смешивая операнды разных размеров, которые вызывают переполнение в операции добавления:
int _tmain(int argc, _TCHAR* argv[])
{
__int8 a=127;
__int8 b=1;
__int16 c=b+a;
__int8 d=b+a;
printf("c=%d,d=%d\n",c,d);
return 0;
}
//result is: c=128, d=-128
Я не понимаю, почему c==128! Насколько я понимаю, в обоих дополнениях b+a по-прежнему считается добавлением двух подписанных 8-битных переменных. Таким образом, результатом является переполнение, т.е. -128. После этого результат повышается до 16-битного целого числа со знаком для первой операции присваивания, а c все равно должно получить 16-битное значение -128. Правильно ли я понимаю? Стандарт С++ немного сложен для чтения. Глава 4, кажется, говорит о целочисленном расширении, но я не могу найти ничего, связанного с этим конкретным примером.