我在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常量。因此,我需要回答以下问题:
由于
答案 0 :(得分:9)
您正在寻找的常量不会被称为LONG_LONG_...
。检查您的limits.h
标题。您很可能是在ULLONG_MAX
,LLONG_MAX
等
答案 1 :(得分:4)
常量为LLONG_MAX
,ULLONG_MAX
等。
至于为什么int
和long 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
阶梯的另一个阶梯。它是 整数类型。给定通常的整数提升,所有缩小类型都会提升为int
。 int
经常处理器的本机位宽。
大多数代码使用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_t
,int16_t
等
C使用40年以上这一事实证明了这种多功能性具有优点。
[为简洁起见,讨论省略了无符号类型,_Bool_t
和char
。也省略了罕见的非幂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