C вывод шестнадцатеричного деления отличается от всех других источников - PullRequest
0 голосов
/ 13 декабря 2018

Я хочу разделить два шестнадцатеричных числа:

, например: 88555680/10000

Теперь из онлайн-калькуляторов с шестнадцатеричным кодом я нахожу:

8855 какрезультат здесь

8855.568 как результат здесь

И в Python я нахожу:

>>> hex(int("0x88555680",16)//int("0x10000", 16))
'0x8855'

Вот мой код C:

# include <stdio.h>

int main()  {
    int a = 0x88555680;
    int b = 0x10000;
    int c = a/b;
    printf("a%x, b%x, c%x\n", a, b, c);
}

С выводом:

a88555680, b10000, cffff8856

В C я нахожу 8856 , в то время как с Python и онлайн-калькуляторами я нахожу 8855

Вопрос: Почему выход C не 8855?Почему это 8856?Если это не 8855. что-то, а затем усечено до 0, то есть 8855?

Я очень плохо знаком с C, это может быть очевидной ошибкой.

1 Ответ

0 голосов
/ 13 декабря 2018

В распространенных системах int - это 32-битный тип, максимальное значение которого 0x7FFFFFFF.Ваше значение 0x88555680 вне диапазона для int.Компилятор должен предупредить вас об этом;если вы не видите предупреждение, я рекомендую изменить настройки компилятора.

Также ваш код вызывает неопределенное поведение при использовании %x для печати int.Спецификатор %x может использоваться только для unsigned int.

Чтобы исправить код в этом случае, используйте unsigned int вместо int для всех 3 переменных.Если вы хотите иметь дело с большими числами, вы можете использовать unsigned long long или uint64_t.(В этих случаях вам также потребуется обновить спецификаторы формата printf).

...