Какой тип использовать для целых чисел больше 2 ^ 32 в C ++?

Надеюсь, вы найдете это полезным.

HTML:

<html>
<head>
    <link rel = "stylesheet" href = "test.css">
<body>

</body>
<script src = "test.js"></script>
</head>
</html>

JAVASCRIPT:

var tableString = "<table>",
    body = document.getElementsByTagName('body')[0],
    div = document.createElement('div');

for (row = 1; row < 101; row += 1) {

    tableString += "<tr>";

    for (col = 1; col < 11; col += 1) {

        tableString += "<td>" + "row [" + row + "]" + "col [" + col + "]" + "</td>";
    }
    tableString += "</tr>";
}

tableString += "</table>";
div.innerHTML = tableString;
body.appendChild(div);
13
задан Igor Oks 1 June 2009 в 11:03
поделиться

13 ответов

В C ++ нет переносимого способа сделать это, поскольку язык не определяет размер целочисленных типов (за исключением того, что sizeof char равен 1). Вам необходимо обратиться к документации вашего компилятора.

8
ответ дан 1 December 2019 в 17:29
поделиться

Используйте long long и, если возможно, добавьте во время компиляции утверждение, что этот тип достаточно широк (что-то вроде sizeof (long long)> = 8 ]).

double предназначен для чисел с плавающей запятой, а не целых.

14
ответ дан 1 December 2019 в 17:29
поделиться

Попробуйте:

http://gmplib.org/ большое число.

http://mattmccutchen.net/bigint/ большое число

Я не использовал ни того, ни другого, но я использовал похожие вещи в Java.

13
ответ дан 1 December 2019 в 17:29
поделиться

Оба предложения не подходят, потому что long long не является стандартным типом данных C ++, а double - с плавающей запятой.

Поскольку моя программа должна быть переносимой, я собираюсь #define мои собственные типы, которые подходят для всех компиляторов, которые я использую (Visual Studio и gcc):

#ifdef WIN32
  #define unsigned_long_long unsigned __int64
  #define long_long __int64
#else // gcc. Might not work on other compilers!
  #define unsigned_long_long unsigned long long
  #define long_long long long
#endif
3
ответ дан 1 December 2019 в 17:29
поделиться

Я предполагаю, что ваши числа уместятся в 64 бита. Если нет, тогда вам понадобится арифметическая библиотека произвольной точности , например GMP .

Теоретически нет простого переносимого способа выполнять 64-битные математические вычисления на C ++. На практике большинство компиляторов C ++ также поддерживают «старомодные» заголовки C, а C99 имеет красивый заголовок под названием stdint.h .

Итак, сначала выполните:

#include <stdint.h>

Затем используйте типы int64_t (подписанный) и uint64_t (беззнаковый).

ИЗМЕНИТЬ ДОБАВИТЬ: После того, как я написал этот ответ, C ++ 11 добавил заголовок который обычно * определяет std :: int64_t и std :: uint64_t, поэтому, если у вас есть современный компилятор, лучше всего использовать их.

(* Теоретически система может вообще не поддерживать 64-битный тип.

8
ответ дан 1 December 2019 в 17:29
поделиться

Не используйте double, потому что:

cout.setf(ios::fixed);
cout << LONG_LONG_MAX << endl;
cout << double(LONG_LONG_MAX) << endl;

cout << LONG_LONG_MAX-100 << endl;
cout << double(LONG_LONG_MAX-100) << endl;

Вывод:

9223372036854775807
9223372036854775808.000000
9223372036854775707
9223372036854775808.000000
3
ответ дан 1 December 2019 в 17:29
поделиться

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

1
ответ дан 1 December 2019 в 17:29
поделиться

Я использую

uint64_t

Но это нестандартно.

2
ответ дан 1 December 2019 в 17:29
поделиться

Попробуйте TTMath . Все, что вам нужно сделать, это включить один заголовок, а затем объявить тип bignum, например:

typedef ttmath::UInt<100> BigInt;

, который создает тип, который может содержать беззнаковые целые числа от 0 до 2 ^ (32 * 100) -1. Затем просто используйте BigInt везде, где вы бы использовали int .

Конечно, вы можете выбрать любой размер для параметра шаблона. 100 может быть излишним; -)

Только что понял, библиотека работает только на x86 и x64, но является кроссплатформенной ОС на этих процессорах.

1
ответ дан 1 December 2019 в 17:29
поделиться

Многие современные компиляторы C / C ++ имеют заголовок stdint.h или inttypes.h.

int_fast64_t или int64_t может быть вариант (ИМХО самый портативный).

1
ответ дан 1 December 2019 в 17:29
поделиться

Насколько переносимой должна быть ваша программа? В TR1 есть cstdint и stdint.h, поэтому он, вероятно, поддерживается большинством современных компиляторов. Затем есть Boost cstdint.hpp, который вы сможете использовать, если cstdint не поддерживается.

1
ответ дан 1 December 2019 в 17:29
поделиться

Если у вашего компилятора немного long, вы можете реализовать их самостоятельно со структурой, содержащей два long, но вам нужно будет осторожно переносить и т. Д. Вы, конечно, можете поискать арифметику с множественной точностью например GMP

0
ответ дан 1 December 2019 в 17:29
поделиться

Двойные значения с плавающей запятой. Возможно, вам стоит использовать long long. Я не знаю, какой псевдоним предпочтительнее.

0
ответ дан 1 December 2019 в 17:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: