为什么 long long int 在使用大整数初始化时会具有错误的值?

问题描述 投票:0回答:2

我试图将“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 操作系统。如何存储这个值?

c long-integer literals integer-overflow
2个回答
4
投票

64 位

long long int
的最大可能值为
9,223,372,036,854,775,807
。你的数字比这个还大。 (请注意,这个数字减去您得到的数字就是您实际想要的数字之一 - 这不是巧合,而是 2 的补码算术的属性)。

它适合

unsigned long long int
,但如果您需要
unsigned
类型,则需要为您的数字使用大型数字库,或者
int128_t
(如果您的编译器支持)。


2
投票

值 10000000000000000000 太大,无法容纳有符号 64 位整数,但可以容纳无符号 64 位整数。因此,当您尝试分配值时,它会以实现定义的方式进行转换(通常只需直接分配二进制表示形式),并且它会打印为负数,因为您很可能使用

%d
%ld
作为格式说明符。

您需要将变量声明为

unsigned long long
并使用
%llu
格式说明符打印它。

unsigned long long x = 10000000000000000000;
printf("x=%llun", x);
© www.soinside.com 2019 - 2024. All rights reserved.