почему vc ++ не ведет себя как мой калькулятор - PullRequest
0 голосов
/ 16 июня 2019

У меня простой вопрос. Если я хотел бы добавить top в шестнадцатеричные значения в vc ++, например 0x140000000 и 0x02F61570, мой калькулятор говорит, что результат равен 0x142f61570, но в моем коде, если я добавлю эти два числа, я получу только 0x42f61570.Где может быть проблема?

Я уже пробовал, возможно, с некоторыми другими значениями, кроме сохранения шестнадцатеричного значения в DWORD, но результат тот же.

DWORD base = 0x140000000;
DWORD address = 0x02F61570;
DWORD next = base + address;
printf("0x%x\n",next);

результат операции вмой код => 0x42f61570, в отличие от моего калькулятора, который говорит 0x142f61570

1 Ответ

0 голосов
/ 16 июня 2019

DWORD - это typedef для 32-разрядного целого числа без знака, а операции над целыми числами без знака в C ++ выполняются с использованием модульной арифметики.printf показывает реальное значение next, и это значение является правильным результатом base + address при использовании арифметики по модулю 2 32 .

Фактически, исходная инициализацияDWORD base = 0x140000000; уже уменьшил значение по модулю 2 32 .Разве ваш компилятор не выдал предупреждение для инициализатора констант вне допустимого диапазона?


Ожидаемый результат достигается при использовании 64-битных переменных.

DWORD64 base = 0x140000000;
DWORD address = 0x02F61570;
DWORD64 next = base + address;
printf("0x%I64x\n", next);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...