Когда я умножаю два символа без знака в 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?