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

Jos*_*lls 0 c integer long-long

我在Windows计算机上使用Codeblocks和GNU编译器.编译器运行时,它会在以下条件下运行:

mingw32-gcc.exe -Wall -g -std=c11 <filename> -o obj\Debug\main.o
Run Code Online (Sandbox Code Playgroud)

我的代码如下:

#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;
}
Run Code Online (Sandbox Code Playgroud)

我输出的代码:

INTEGER min: -2147483648
INTEGER max: 2147483648

UNSIGNED INTEGER max: 4294967295

LONG INTEGER min: -2147483648
LONG INTEGER max: 2147483648

UNSIGNED LONG INTEGER max: 4294967295
Run Code Online (Sandbox Code Playgroud)

引用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)
Run Code Online (Sandbox Code Playgroud)

但是,在键入代码时,CodeBlocks提供了代码提示,表明我实际上可以使用LONG_LONG常量.因此,我需要回答以下问题:

  1. 为什么整数和长整数具有相同的限制?长整数不应该有更大的值范围吗?
  2. 为什么我遇到LONG_LONG常量有问题?这是否意味着我不能使用长整数?

谢谢

vir*_*tor 9

你正在寻找的常数不会被调用LONG_LONG_....检查你的limits.h标题.最有可能你后ULLONG_MAX,LLONG_MAX


Cod*_*ent 5

该常数LLONG_MAXULLONG_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;
}
Run Code Online (Sandbox Code Playgroud)

在我的 64 位 Mac OS X 上,打印:

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
Run Code Online (Sandbox Code Playgroud)

编辑:如果您想编写可移植代码并具有固定宽度的整数,请使用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
Run Code Online (Sandbox Code Playgroud)