当前位置: 首页 > 知识库问答 >
问题:

如何在C程序中使用较大的整数?

沈俊晤
2023-03-14

我在Windows计算机上使用代码块和GNU编译器。当编译器运行时,它会在以下条件下运行:

mingw32-gcc.exe -Wall -g -std=c11 <filename> -o obj\Debug\main.o

我的代码如下:

#include <stdio.h>
#include <limits.h>

int main()
{
    printf("INTEGER min: %d\n", INT_MIN);
    printf("INTEGER max: %d\n\n", INT_MAX);
    printf("UNSIGNED INTEGER max: %u\n\n", UINT_MAX);
    printf("LONG INTEGER min: %ld\n", LONG_MIN);
    printf("LONG INTEGER max: %ld\n\n", LONG_MAX);
    //printf("LONG LONG INTEGER min: %lld\n", LONG_LONG_MIN);
    //printf("LONG LONG INTEGER max: %lld\n\n", LONG_LONG_MAX);
    printf("UNSIGNED LONG INTEGER max: %lu\n\n", ULONG_MAX);
    //printf("UNSIGNED LONG LONG INTEGER max: %lld\n", ULONG_LONG_MAX);
    printf("\n");
    return 0;
}

我对此代码的输出:

INTEGER min: -2147483648
INTEGER max: 2147483648

UNSIGNED INTEGER max: 4294967295

LONG INTEGER min: -2147483648
LONG INTEGER max: 2147483648

UNSIGNED LONG INTEGER max: 4294967295

引用 LONG LONG 整数的行被注释掉,因为编译器给出了错误:

error: 'LONG_LONG_MIN' undeclared (first use in this function)
error: 'LONG_LONG_MAX' undeclared (first use in this function)
error: 'ULONG_LONG_MAX' undeclared (first use in this function)

然而,在键入代码时,CodeBlocks提供了代码提示,表明我实际上可以使用LONG_LONG常量。因此,我需要以下问题的答案:

    < li >为什么整数和长整数具有相同的限制?长整数不应该有更大的取值范围吗? < li >为什么LONG_LONG常量有问题?这是否意味着我不能使用长整型?

谢谢

共有3个答案

曹建明
2023-03-14

为什么整数和长整数有相同的限制?长整数不是应该有更大的取值范围吗?

您已经进入了C语言的标志之一 - 它的适应性。

C定义int的范围至少与long一样宽,long的范围至少与int一样宽。都有最小范围。

C没有精确定义< code>short、int、long的范围,而是选择了通用性。在OP的平台上,< code>int的范围与< code>long (32位)的范围相匹配。在2016年的许多嵌入式处理器(以及70、80年代的家用电脑)上,< code>int的范围与< code>short (16位)的范围相匹配。在某些平台(64位)上,< code>int的范围大于< code>short,小于< code>long。所以直接回答OP的问题:< code>int并不总是与< code>long具有相同的范围。

诀窍在于< code>int不仅仅是< code>singed char,short,int,long,long long阶梯的另一个梯级。它是整数类型。给定通常的整数提升,所有的缩小类型都提升为< code>int。< code>int通常是处理器的本机位宽。

大多数代码都是用int作为32位编写的,也有很大一部分是16位的。对于64位处理器,将int作为64位是可能的,但这只剩下2种标准类型用于有符号字符,短用于8、16和32位。

接下来,简单计算有符号字符范围

40年后使用C的事实证明了这种多功能性有/有优点。

[为了简洁起见,讨论省略了无符号类型、_Bool_tchar。还省略了罕见的非2次方类型(9、18、24、36等)]

羊和光
2023-03-14

常量有< code>LLONG_MAX、< code>ULLONG_MAX等。

至于为什么intlong int具有相同的值,怪C标准:它没有为每种数据类型定义固定的位数,只有最小位数:

  • int必须至少为16位
  • long int必须至少为32位
  • long long int必须至少为64位

确切的位数因操作系统而异。

#include <stdio.h>
#include <limits.h>

int main()
{
    printf("INTEGER min: %d\n", INT_MIN);
    printf("INTEGER max: %d\n\n", INT_MAX);
    printf("UNSIGNED INTEGER max: %u\n\n", UINT_MAX);
    printf("LONG INTEGER min: %ld\n", LONG_MIN);
    printf("LONG INTEGER max: %ld\n\n", LONG_MAX);
    printf("LONG LONG INTEGER min: %lld\n", LLONG_MIN);
    printf("LONG LONG INTEGER max: %lld\n\n", LLONG_MAX);
    printf("UNSIGNED LONG INTEGER max: %lu\n\n", ULONG_MAX);
    printf("UNSIGNED LONG LONG INTEGER max: %llu\n", ULLONG_MAX);
    printf("\n");
    return 0;
}

在我的 Mac OS X(64 位)上,可以打印:

INTEGER min: -2147483648
INTEGER max: 2147483647

UNSIGNED INTEGER max: 4294967295

LONG INTEGER min: -9223372036854775808
LONG INTEGER max: 9223372036854775807

LONG LONG INTEGER min: -9223372036854775808
LONG LONG INTEGER max: 9223372036854775807

UNSIGNED LONG INTEGER max: 18446744073709551615

UNSIGNED LONG LONG INTEGER max: 18446744073709551615

编辑:如果要编写可移植代码并具有固定宽度的整数,请使用stdint.h

#include <stdint.h>

printf("int64_t max : %lld\n\n", INT64_MAX);  // 9223372036854775807
printf("uint64_t max: %llu\n\n", UINT64_MAX); // 18446744073709551615
商茂勋
2023-03-14

您要查找的常量不称为LONG_LONG_...。检查您的限制.h 标头。最有可能的是,您正在追求ULLONG_MAXLLONG_MAX等。

 类似资料:
  • 问题内容: 在C ++程序中使用Redis数据库的最佳方法是什么? 问题答案: 使用C绑定库?似乎在任何地方都没有C ++包装器。

  • 问题内容: 我需要在Go中对int64的较大值执行运算,例如求幂和除法,但是我遇到了溢出问题。我尝试将它们转换为float64,但随后遇到其他问题。这是我尝试过的。 我有一个整数变量,必须将其转换为float64才能使用方便的数学包(https://golang.org/pkg/math)。 但是,如果整数变量太大,则无法正确转换。我假设这是因为大小大于float64。例如: 我正在尝试使用mat

  • 我正在用c开发一个应用程序,我想使用solr来索引sqlite数据库,我在网上搜索了一下,发现我需要使用JNI:http://randr . svbtle . com/experiment-with-embedded-Solr-in-Java-and-c,但是我发现jar有很多问题(我使用了\solr-4.9.0\dist\solrj-lib和\solr-4.9.0\dist和\solr-4.9.

  • 问题内容: libGDX应用程序必须实现.resize(int width,int height)方法,因此我认为调整libGDX应用程序的大小并不重要,但是我发现没有办法制作实际的应用程序JFrame或与JFrame一样可拖动的东西。 setResizable(true)。libGDX根本不可能吗? 问题答案: 如果您将gdx-backend-lwjgl用于桌面应用程序,则可以使用: 使用来自S

  • 问题内容: 我的作业很困惑。我必须编写一个程序,允许用户输入要购买的鸡蛋数量。然后,程序将告诉他们可以装多少盒(六个鸡蛋),还剩下多少个鸡蛋。 我需要确保如果用户输入非整数值,将显示错误消息。我不知道该怎么做,任何帮助将不胜感激!是与while循环有关还是我完全错了? 问题答案: 让用户输入他想要的任何内容,并仅在它不是整数时发出警告: 这毕竟是Python的方式,毕竟这是“请求宽容比允许更容易”

  • 问题内容: 我正在构建我的第一个Flask应用程序,但找不到一种干净利落的Python方式来组织应用程序。我不想像他们的示例一样将所有内容都放在一个.py文件中。我想将我的应用程序的每个部分放在一个单独的模块中。什么是组织事物的好方法? 问题答案: 我创建了一个名为“ Fbone ” 的Flask样板项目,请随时检查并进行分叉:) Fbone(Flask bone)是Flask(Pythonmic