Вопрос

Я хочу умножить длинные номера, которые приведены в 2 ^ 32 основания. Я уже подумал о хорошем алгоритме для этого, но, к сожалению, я застрял. Ситуация, на которой я застрял, - это то, как я делаю умножение два длинных INT и представляю его на 2 ^ 32 основания.

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
typedef unsigned int uint32;
typedef unsigned long long uint64;
int main(int argc, char* argv[] )
{

  uint64 a = (uint64)ULONG_MAX;
  printf("%llu\n", a);
  uint64 b = (uint64)ULONG_MAX;  
  printf("%llu\n", b);  
  uint64 c = (uint64)(a*b);

  printf("%llu\n", c);  // prints 1. that would be to lower 32 bits of the results. the upper half is 0xFFFFFFFE

  printf("%llu\n", ULLONG_MAX);
  system("pause");
}

Почему ullong_max такой же, как ulong_max? Согласно с http://en.wikipedia.org/wiki/limits.h#member_Constants Это должно быть 18 446 744 073 709 551,615 I

Как вы можете видеть из моих комментариев, я хочу результат множителя в два UINT32. ShowerHalf будет 0x1 и верхняя половина 0xFFFFFFE. Как мне получить эти ценности?

(Я нашел этот вопрос на так, но это не полезно в моей ситуации, потому что ответы даны AR иллюстрации моих идей: Умножение двух длинных длинных ints c)

Редактировать:Моя система Windows XP 32-бит. Я использую GCC 3.4.2 (Mingw-Special)

Вывод я получаю при запуске кода:

4294967295
4294967295
1
4294967295

Редактировать2:

  printf("%i\n", sizeof(unsigned long));
  printf("%i\n", sizeof(unsigned long long)); 

возвращается

4
8

Редактировать 3:Благодаря Петю, я смог найти решение:

  printf("%lu\n", c & 0xFFFFFFFF);
  printf("%lu\n", (c >> 32));
Это было полезно?

Решение

Подсказка находится в системе («пауза») - вы находитесь в Windows? Печать давно, используя время выполнения Microsoft Visual C требует использования «% i64U» (это столица I).

Это основано на том вопросительном вопросе Как вы печатаете долгого долгосрочного INT (спецификатор формата для долгосрочного INT)?

Другие советы

Не уверен, почему вы получаете эти результаты с вашим (неуточненным) компилятором, но gcc Под Ubuntu 10 дает:

4294967295
4294967295
18446744065119617025
18446744073709551615

с этими последними двумя 0xfffffffe00000001 и (264-1) соответственно, как вы желаете.

Так что, возможно, рассмотрим переход на более актуальный компилятор. Это может быть вы используете компилятор Pre-C99.

Просто из интереса, что делает sizeof (unsigned long) а также sizeof (unsigned long long) Дайте вам в вашей системе. Это будет иметь большое значение, чтобы объяснить вашу проблему.


Пара других вещей, чтобы проверить, так как ваш sizeofПохоже, указывает на сами типы данных в порядке (хотя они могут не исправить проблему - они были найдены с Доворный веб-поиск):

  • Попробуйте использовать "%I64u" как строка формата вместо "%llu". Отказ Если Mingw использует libs msvcrt, что может потребоваться для реальных 64-битных printf служба поддержки.
  • Убедитесь, что вы компилируете -std=c99.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top