Я пытаюсь сохранить значение типа long long int, но возвращаю неверный результат - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь сохранить "10000000000000000000" (19 нулей) внутри типа данных long long int.

        #if __WORDSIZE == 64
        typedef long long int       intmaximum_t;
        #else
        __extension__
        typedef unsigned long int   intmaximum_t;
        #endif


        const intmaximum_t  = 10000000000000000000;

Но он выдает «-8446744073709551616» (отрицательный).

У меня есть 64-битная машина с ОС Ubuntu. Как сохранить это значение?

Ответы [ 2 ]

4 голосов
/ 09 мая 2019

Максимально возможное значение для 64-битного long long int - 9,223,372,036,854,775,807.Ваш номер больше этого.(Обратите внимание, что это число меньше того, которое вы получаете, равно числу, которое вы на самом деле хотите - это не совпадение, а свойство арифметики дополнения к 2).

Это будет соответствовать unsigned long long int, но если вывам нужен тип unsigned, для вашего номера вам понадобится библиотека больших чисел или int128_t, если ваш компилятор его поддерживает.

2 голосов
/ 09 мая 2019

Значение 10000000000000000000 слишком велико, чтобы поместиться в 64-разрядное целое число со знаком, но поместится в 64-разрядное целое число без знака. Поэтому, когда вы пытаетесь присвоить значение, оно преобразуется определенным для реализации способом (как правило, просто назначая двоичное представление напрямую), и оно печатается как отрицательное, потому что вы, скорее всего, используете %d или %ld в качестве спецификатора формата.

Вам необходимо объявить вашу переменную как unsigned long long и распечатать ее с указателем формата %llu.

unsigned long long x = 10000000000000000000;
printf("x=%llun", x);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...