Отображение очень большого числа - PullRequest
2 голосов
/ 29 октября 2011

Поскольку мы знаем, что 4294967295 - самое большое число в unsigned int, если я умножу это число на себя, то как его отобразить?Я попытался:

long unsigned int NUMBER = 4294967295 * 4294967295;

, но все еще получаю 1 в качестве ответа.

Ответы [ 4 ]

3 голосов
/ 29 октября 2011

Вы получаете переполнение.Рассмотрим дублирование в шестнадцатеричном формате:

0xffffffff * 0xffffffff == 0xfffffffe00000001
                                     ^^^^^^^^
                                     only the last 32 bits are returned

Решение состоит в том, чтобы использовать больший тип, например long long unsigned:

long long unsigned int NUMBER = 4294967295ULL * 4294967295ULL;

Суффикс ULL означает unsigned long long.

Посмотрите, как работает онлайн: ideone

1 голос
/ 29 октября 2011

Умножение переполняется.

#include <stdio.h>
int main()
{
    unsigned int a = 4294967295;
    unsigned int b = 4294967295;

    // force to perform multiplication based on larger type than unsigned int
    unsigned long long NUMBER = (unsigned long long)a * b;
    printf("%llu\n", NUMBER);
}
0 голосов
/ 29 октября 2011

Да, это переполнение.Если вы используете c, то не существует простого способа сделать такое большое число умноженным, как я знал.Может быть, вам нужно написать один самостоятельно.На самом деле некоторые языки изначально поддерживают такие функции.

0 голосов
/ 29 октября 2011

Вы утверждаете в своем вопросе, что знаете, что max int равно 4294967295. Это означает, что вы не можете хранить число больше этого, если используете unsigned int.

C long хранит до 18 446 744 073 709 551 615 в неподписанном виде в 64-битной системе Unix [источник] , поэтому вам нужно только суффиксить свои числа с UL: 4294967295UL

Если вы не используете 64-битную Unix-систему, вам следует использовать long long unsigned int и суффикс с LL

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