C 我试图用long int类型存储值,但返回错误

C 我试图用long int类型存储值,但返回错误,c,C,我试图在long int数据类型中存储“100000000000000000”(19个零) #if __WORDSIZE == 64 typedef long long int intmaximum_t; #else __extension__ typedef unsigned long int intmaximum_t; #endif const intmaxim

我试图在long int数据类型中存储“100000000000000000”(19个零)

        #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操作系统。如何存储此值?

64位
长整型的最大可能值是
9223372036854775807
。你的数字比那还大。(请注意,这个数字减去你得到的数字是你实际想要的数字的一个-这不是巧合,而是2的补码运算的一个属性)


它适合于
无符号long long int
类型,但如果需要
无符号
类型,则需要使用大数字库作为数字,或者
int128_t
如果编译器支持它。

值100000000000000000太大,无法用于有符号64位整数,但可以用于无符号64位整数。因此,当您尝试分配值时,它会以实现定义的方式进行转换(通常是直接分配二进制表示法),并以负数打印,因为您很可能使用
%d
%ld
作为格式说明符

unsigned long long x = 10000000000000000000;
printf("x=%llun", x);
您需要将变量声明为
unsigned long long
,并使用
%llu
格式说明符打印它

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

此代码未生成任何输出,请提供一个。请选择一种语言。C和C++是不同的语言,输出依赖于适当的格式说明符。您根本不显示对
printf
的任何函数调用。请尝试
unsigned long long
而不是
unsigned long int
尝试
unsigned long long
。2^63=9.22*10^18。那你为什么期待一个可预测的结果呢?我更希望编译器警告你这个数字不合适。阅读编译器警告,进行计算。您不也需要将文本指定为无符号(最好是长-长)吗<代码>100000000000000000ull
。我不认为整数提升会使有符号数变成无符号数,而且由于没有足够大的有符号类型来保存该值,因此您必须自己执行该操作。@Christiangibons常量根据其值和表示形式隐式指定一个类型。在这种情况下,常量隐式为
无符号long
。不需要后缀。嗯,这似乎在我的测试中得到了验证(尽管它确实用
-Wall-Wextra-pedantic
给出了编译器警告)。我确信大约一年前我遇到了一个问题,因为无法以其他方式表示值,我不得不将整数文本强制为
ULL
。我得看看能不能找到促使这种需要的确切用法。