переполнение при умножении беззнаковых символов?

Когда я умножаю два символа без знака в C следующим образом:

unsigned char a = 200;
unsigned char b = 200;
unsigned char c = a * b;

Тогда я знаю, что у меня будет переполнение, и в результате я получаю (40 000 по модулю 256). Когда я сделаю это:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = (int)a * (int)b;

я получу правильный результат 40'000. Однако я не знаю, что с этим происходит:

unsigned char a = 200;
unsigned char b = 200;
unsigned int c = a * b;

Могу ли я быть уверен, что все происходит правильно? Зависит ли этот компилятор? Точно так же я не знаю, что происходит при вычитании:

unsigned char a = 1;
unsigned char b = 2;
int c = a - b;

Когда я делаю «c» беззнаковым символом, я, вероятно, в результате получу 255. Что происходит, когда я использую такой тип int?

7
задан Jan Rüegg 7 June 2011 в 14:16
поделиться