0

我在 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 常量时遇到问题?这是否意味着我不能使用 long long 整数?

谢谢

4

4 回答 4

9

您要查找的常量未被调用LONG_LONG_...。检查你的limits.h标题。很可能你在追求ULLONG_MAX,LLONG_MAX等。

于 2016-04-12T03:17:02.880 回答
5

常数为LLONG_MAX,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;
}

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

编辑:如果您想编写可移植代码并具有固定宽度的整数,请使用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
于 2016-04-12T03:21:32.043 回答
2

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

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

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

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

诀窍在于,这int不仅仅是梯子的另一个梯级singed char, short, int, long, long long。它是整数类型。给定通常的整数提升,所有窄类型提升为intint通常处理器的本机位宽。

大多数代码都是用int32 位编写的,也有很大一部分是用 16 位编写的。对于 64 位处理器,具有64 位是可能的,但是对于 8 位、16 位和 32 位,int只剩下 2 种标准类型。signed char, short

展望未来,简单地计算signed char范围范围、<=范围范围、范围范围。也就是至少 8 位、至少 16 位、至少 32 位、至少 64 位。如果代码需要明确的宽度,请使用,等。shortshort<=intint<=longsigned charshort, intlonglong longint8_tint16_t

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

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

于 2016-04-12T04:38:16.457 回答
1

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

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

(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

于 2016-04-12T04:39:56.603 回答