EgoRusMarch
@EgoRusMarch
C++ Developer

Как пользоваться stdint.h?

В общем, была у меня проблема, не знал я как числа сохранять очень большие (для шифрования нужны были).
И вот нашел я случаем библиотеку stdint.h. Определены там такие типы:

207c7589645543c8a46e69698b253c1a.png
Самое большое uint_fast64_t = 2^64-1

2^64
93d68f93a080474b93c3db43729b9a97.png
Попробовал что-нибудь с ним сделать:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>

int main(void)
{
	uint_fast64_t number = 18446744073709551615;

	printf("%d\n",number);

	system("pause");
	return 0;
}

И вот что получил:
C:\Users\Егор\Desktop>gcc -std=c11 verybigint.c
verybigint.c: In function 'main':
verybigint.c:7:25: warning: integer constant is too large for its type
  uint_fast64_t number = 18446744073709551615;
                         ^

Даже присваиваться не хочет, как такое выводить тоже не понятно.
  • Вопрос задан
  • 998 просмотров
Решения вопроса 1
15432
@15432
Системный программист ^_^
Для крипты, если хочется ручками потрогать - либа BigDigits, всё необходимое есть (проверка на простоту, возведение в степень, работа с очень большими числами, и т.д.)
www.di-mgt.com.au/bigdigits.html

по вашему вопросу - у вас число неправильное
184467440737095511615
18446744073709551615 <-- правильное

(меня плющит, или в вопросе число поменялось на правильное?)

и можно юзать тип unsigned long long

unsigned long long number = 18446744073709551615; //у меня компилится без нареканий

имхо, проще в шестнадцатеричной:
unsigned long long number = 0xFFFFFFFFFFFFFFFF;
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
uint_fast64_t number = 184467440737095511615;

В этом месте нужно написать
uint_fast64_t number = UINT64_C(184467440737095511615);

Даже присваиваться не хочет, как такое выводить тоже не понятно.

В inttypes.h есть макросы для форматирования типов из stdint.h в printf, вам нужен PRIuFAST64:
printf("%"PRIuFAST64"\n", number);

Ну и да, для криптографии этих типов скорее всего будет мало. Порекламирую https://gmplib.org/ для разнообразия.
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас в константе единичка лишняя
184467440737095511615
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

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