在C编程语言中,在类型声明中使用关键字“int”来为变量指定整数类型。然而,该类型表示整数的事实并不意味着它可以表示 全部的 整数。int变量的大小是固定的,由您使用的C实现决定。C标准规定int的范围必须至少为-32767到+32767。C实现的范围可以,而且经常会比这大得多。特定C实现中int类型的范围可以通过头文件中定义的int_MAX和int_MIN变量获得 :
C
#include <limits.h> #include <stdio.h> int main() { printf ( "minimum int value = %d" "maximum int value = %d" "size of int in bytes = %zu" "size of int in bits = %zu" , INT_MIN, INT_MAX, sizeof ( int ), sizeof ( int ) * CHAR_BIT); } |
minimum int value = -2147483648maximum int value = 2147483647size of int in bytes = 4size of int in bits = 32
请记住,并非所有的C实现都是相同的,而且它们的整数类型范围也不相同。
有符号整数
这个 智力 C中的类型是有符号整数,这意味着它可以表示负数和正数。这与无符号整数(可以通过声明变量来使用)形成对比 无符号整型 ),它只能表示正数。
尝试为有符号整数类型分配超出其可表示值范围(从INT_MIN到INT_MAX)的值将导致未定义的行为。
有符号整数在所有现代机器上通常使用2的补码,在即将到来的(2022年1月)C23标准中,2的补码是表示有符号整数的唯一有效方式。你可以阅读更多关于有符号数字在二进制中是如何表示的,以及为什么二的补码是二进制中最常见的表示形式 本文 .
无符号整数
对于无符号整数,只能存储正数。在这种数据类型中,整数中的所有位都用于存储正值,而不是为符号信息保留一些位。这意味着无符号整数中最大可表示值的大小大于具有相同位数的有符号整数的大小。
在一个 无符号整型 值,最大值由中定义的UINT_MAX宏指定 ,最小值为0。根据C标准,无符号算术永远不会溢出,而是以无符号类型的最大值+1为模执行,因此 无符号整型 ,以UINT_MAX+1为模执行算术,使得UINT_MAX+1为0,UINT_MAX+2为1,依此类推:
C
#include <limits.h> #include <stdio.h> int main() { printf ( "UINT_MAX + 1 = %u" , UINT_MAX + 1); } |
UINT_MAX + 1 = 0