C语言 为什么一个long long int在初始化一个巨大的整数时会有错误的值?

amrnrhlw  于 2023-10-16  发布在  其他
关注(0)|答案(2)|浏览(121)

我正在尝试将10000000000000000000(1019)存储在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
我有一台运行Ubuntu的64位机器。如何存储此值?

nwwlzxa7

nwwlzxa71#

64位long long int的最大可能值是9,223,372,036,854,775,807。你的数字比那大。(注意,这个数减去你得到的数是你实际想要的数的一个-这不是巧合,而是2的补码算术的一个属性)。
它适合unsigned long long int,但是如果你需要一个unsigned类型,你需要为你的数字使用一个大的数字库,或者如果你的编译器支持的话,使用int128_t

wnrlj8wa

wnrlj8wa2#

值100000000000000000太大,不适合有符号的64位整数,但适合无符号的64位整数。因此,当你试图赋值时,它会以实现定义的方式进行转换(通常是直接赋值二进制表示),并且它会打印为负数,因为你很可能使用%d%ld作为格式说明符。
您需要将变量声明为unsigned long long,并使用%llu说明符打印它。

unsigned long long x = 10000000000000000000;
printf("x=%llun", x);

相关问题