Когда я собираюсь умножить переменную uint32 на переменную sint32, почему я получаю неправильный ответ? - PullRequest
0 голосов
/ 03 января 2019
sint32 MulDiv (uint32 x_value, sint32 y_value, uint32 z_value) {
    sint64 v_Result_value;
    sint64 v_Temp_Val;
    v_Temp_Val = x_value * y_value;
    if (0 == z_value) {
        if(v_Temp_Val >= 0) {
            v_Result_value = MAX_VAL;
        } else {
            v_Result_value = MIN_VAL;
        }
    }
    return v_Result_value;
}

Если я пройду:

  • x_value as 4294967295
  • y_value as -12

v_Temp_Val станет 12, что не ожидается.

1 Ответ

0 голосов
/ 03 января 2019

С выражением x_value * y_value значения x_value и y_value проходят через Обычное арифметическое преобразование , что

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

То естьзначение -12 «конвертируется» в значение без знака, и благодаря тому, как дополняет два (самый распространенный способ обработки отрицательных чисел на компьютерах), значение -12 преобразуется в очень большое значение(4294967284 точнее).

Умножение 4294967295 на 4294967284 приводит к арифметическому переполнению (поскольку это 32-разрядное умножение с 32-разрядным результатом), но оно хорошо определено для целых чисел без знака,Однако результат не будет тем, что вы ожидаете.

...