Вопрос о шестнадцатеричном умножении в C с использованием типа данных int64_t - PullRequest
0 голосов
/ 15 марта 2011

Когда я пытаюсь выполнить шестнадцатеричное умножение 16 битов на 16 бит с использованием типа данных int64_t, отображаемый результат ограничивается 32 битами, а 33-битный, если он присутствует, никогда не отображается, хотя я определяю операнды, а такжедлина результата составляет 64 бита.

Вот простой код, который я использую:

#include<stdio.h>  
#include <stdint.h>  

int main()  
{  
   int64_t a, b, r;  
   a = 0xabcd;  
   b = 0xdbca;  
   r = a * b * 3;  
   printf("%x", r);  
   return 0;  
} 

Выводится следующий результат: ba7fcc46

Ожидаемый результат:1ba7fcc46

Пожалуйста, помогите мне здесь.

Ответы [ 4 ]

4 голосов
/ 15 марта 2011

Спецификатор формата для int64_t зависит от платформы (%I64x для Windows, %llx для любой другой платформы, YMMV). Таким образом, есть макрос, который вы можете использовать, который выглядит уродливо, но будет работать в любой системе:

#include <inttypes.h>
...
printf("%" PRIx64 "\n", r);

Если вы не возражаете против того, что ваш код не работает в Windows, вы можете просто использовать %llx.


(отредактировано; имя макроса неверно)

2 голосов
/ 15 марта 2011

Популярным решением является использование %llx для вашего printf формата.ll означает long long (64-битная длина практически во всех системах), хотя это не переносимо.

Переносимое (но менее разборчивое) решение заключается в использовании ответа @ anatolyg, перепечатанного здесь:

#include <inttypes.h>
// ...
printf("%" PRIx64 "\n", r);
0 голосов
/ 15 марта 2011

На самом деле у соответствующей программы есть только несколько способов специально напечатать int64_t, и все они выглядят примерно так:

#include <stdio.h>
#include <inttypes.h>

void f(int64_t x) {
  printf("Value %30" PRId64 "\n", x);
}

int main(void) {
  f((int64_t)1000000000 * 1000000000);
  return 0;
}
0 голосов
/ 15 марта 2011

что мы делаем, это

#if __WORDSIZE == 64
printf("%lx\n", r);
#else
printf("%llx\n", r);
#endif

Это сохраняет правильный тип для 64-битных и 32-битных машинКстати, это для gcc / g ++.Не уверен, что он портативный

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...