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

时间:2016-04-12 03:14:01

标签: c integer long-long

我在Windows计算机上使用Codeblocks和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常量。因此,我需要回答以下问题:

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

4 个答案:

答案 0 :(得分:9)

您正在寻找的常量不会被称为LONG_LONG_...。检查您的limits.h标题。您很可能是在ULLONG_MAXLLONG_MAX

之后

答案 1 :(得分:4)

常量为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;
}

在我的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

答案 2 :(得分:2)

  

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

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

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

而不是精确定义short, int, long的范围,C选择了多功能性。在OP平台上,int的范围与long(32位)的范围匹配。在2016年的许多嵌入式处理器(以及70年代,80年代的家用计算机)上,int的范围与short(16位)的范围相匹配。在某些平台(64位)上,int的范围超过short long更窄。直接针对OP的问题: int并不总是与long具有相同的范围。

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

大多数代码使用int编写为32位,并且大部分编写为16位。对于64位处理器,可以将int作为64位,但对于{16}和32位,signed char, short只留下2种标准类型。

展望未来,简单依靠signed char范围<= short范围,short范围<= int范围, int范围<= long范围等。signed char至少为8位,short, int至少为16位, long至少32位,long long至少64位。如果代码需要显式宽度,请使用int8_tint16_t

C使用40年以上这一事实证明了这种多功能性具有优点。

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

答案 3 :(得分:1)

除了具有特定实现的系统上的limits.h之外,还要检查C标准定义各种整数的限制:

下面给出的值应替换为适用于#if的常量表达式     预处理指令。而且,除了CHAR_BIT和MB_LEN_MAX之外     以下内容应替换为与a相同类型的表达式     表达式,它是根据整数转换的相应类型的对象     促销活动。它们的实现定义值的大小应相等或更大

(absolute value) to those shown, with the same sign.
-- number of bits for smallest object that is not a bit-field (byte)
   CHAR_BIT                                            8
-- minimum value for an object of type signed char
   SCHAR_MIN                                -127 // -(27 - 1)
-- maximum value for an object of type signed char
   SCHAR_MAX                                +127 // 27 - 1
-- maximum value for an object of type unsigned char
   UCHAR_MAX                                 255 // 28 - 1
-- minimum value for an object of type char
   CHAR_MIN                               see below
-- maximum value for an object of type char
   CHAR_MAX                              see below
-- maximum number of bytes in a multibyte character, for any supported locale
   MB_LEN_MAX                                    1
-- minimum value for an object of type short int
   SHRT_MIN                               -32767 // -(215 - 1)
-- maximum value for an object of type short int
   SHRT_MAX                               +32767 // 215 - 1
-- maximum value for an object of type unsigned short int
   USHRT_MAX                               65535 // 216 - 1
-- minimum value for an object of type int
   INT_MIN                                 -32767 // -(215 - 1)
-- maximum value for an object of type int
   INT_MAX                                +32767 // 215 - 1
-- maximum value for an object of type unsigned int
   UINT_MAX                                65535 // 216 - 1
-- minimum value for an object of type long int
   LONG_MIN                         -2147483647 // -(231 - 1)
-- maximum value for an object of type long int
   LONG_MAX                         +2147483647 // 231 - 1
-- maximum value for an object of type unsigned long int
   ULONG_MAX                         4294967295 // 232 - 1
-- minimum value for an object of type long long int
   LLONG_MIN          -9223372036854775807 // -(263 - 1)
-- maximum value for an object of type long long int
   LLONG_MAX          +9223372036854775807 // 263 - 1
-- maximum value for an object of type unsigned long long int
   ULLONG_MAX         18446744073709551615 // 264 - 1

来自http://www.iso-9899.info/n1570.html#5.2.4.2.1