int的取值范围是什么?

Python014

int的取值范围是什么?,第1张

C语言int的取值范围在32/64位系统中都是32位,范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295。

C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同。

C的数据类型包括:整型、字符型、实型或浮点型(单精度和双精度)、枚举类型、数组类型、结构体类型、共用体类型、指针类型和空类型。

基本数据类型:

void:声明函数无返回值或无参数,声明无类型指针,显示丢弃运算结果。(C89标准新增)。

char:字符型类型数据,属于整型数据的一种。(K&R时期引入)。

int:整型数据,表示范围通常为编译器指定的内存字节长。(K&R时期引入)。

float:单精度浮点型数据,属于浮点数据的一种。(K&R时期引入)。

double:双精度浮点型数据,属于浮点数据的一种。(K&R时期引入)。

_Bool:布尔型(C99标准新增)。

_Complex:复数的基本类型(C99标准新增)。

_Imaginary:虚数,与复数基本类型相似,没有实部的纯虚数(C99标准新增)。

_Generic:提供重载的接口入口(C11标准新增)。

1、nt型为带符号整数类型,对于16位编译器,int占2字节8位;对于32位和64位编译器,int型占4字节32位。不同的占用空间,int型的范围也不同:2字节时,int 范围为-32768~32767;4字节时,int范围为-2147483648~2147483647。

无论是哪种存储方式,均是最高位为符号位,0代表正数,1代表负数。剩余位存储实际值。

2、字符是指计算机中使用的字母、数字、字和符号,包括:1、2、3、A、B、C、~!·#¥%??—*()——+等等。在 ASCII 编码中,一个英文字母字符存储需要1个字节。在 GB 2312 编码或 GBK 编码中,一个汉字字符存储需要2个字节。

3、字符型数据在内存中储存的是它的ASCII码值,它是一个字节,所有数据类型在内存中都是以0和1代码二进制储存的,这个原则不会变。

4、在UTF-8编码中,一个英文字母字符存储需要1个字节,一个汉字字符储存需要3到4个字节。在UTF-16编码中,一个英文字母字符或一个汉字字符存储都需要2个字节(Unicode扩展区的一些汉字存储需要4个字节)。在UTF-32编码中,世界上任何字符的存储都需要4个字节。

5、char是C/C++整型数据之一,其它的如int/long/short等不指定signed/unsigned时都默认是signed,char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。

结论,取值范围是-2^31~2^31-1(十六进制为0x80000000~0x7fffffff)。因为0既不是正数也不是负数,+0是0,-0是最小的负数(-最大正数-1),所以负数的取值范围比正数多一个数。

int为四个字节,一共32位,其中最高位为符号位,0表示正数,1表示负数,剩下的31位表示数。所以一共可表示2*2^31即2^32个数字(包括一个0)。

在计算机中保存有符号数,保存的是数的二进制的补码,正数的源码、反码、补码相同,负数的反码为源码除符号位之外其余位取反,补码为反码+1(符号位不参与这个运算)。

在计算机中,正数为常量,且源码和补码相同,所以存储正数直接存就行。而负数因为有一个负号-,所以负数是一个计算表达式,都是由负数的绝对值计算出该负数的补码后存储在计算机中的。

求负数的补码值的时候,如-5,首先确定其符号位是1,后面写出其绝对值的二进制形式,28个0后面跟101,反码为29个1后面跟010,再加1就是补码29个1后面跟011,那么-5在计算机中就是存为29个1后面跟011。

所以可知0是32个0,最大正整数为0后面31个1,即2^31-1(2^31个数里包含了0,所以正数的个数要减去一个)。按理说正负数应该是对称的,最小的负数应该是-最大正整数,即-(2^31-1),为什么实际上最小的负数为  -最大正整数-1?为什么-0是最小的负数?

注意,虽然  -最大正整数-1  就是 -(2^31-1)-1 = -2^31,但是写的时候不能写 int i = -2^31因为说了负数其实是一个计算表达式,实际上是先对正数取反然后加1,符号位置为1,但是正数最大值是2^31-1,所以写-2^31是溢出的,这涉及到另外一个知识点。

先解释为什么-0是最小的负数(负的最大正整数-1)。

负的最大正整数的源码:32个1。反码:1后面跟31个0。补码:左右各1个1,中间30个0。所以,负的最大正整数(-(2^31-1))在计算机中存储为:1三十个零1。负的最大正整数-1就是负的最大正整数加-1。-1的补码为:32个1(十六进制为0xffffffff),那么两个补码相加:1三十个零1 + 32个1 = 1三十一个零。所以  负的最大正整数减一  的补码为:1三十一个零(十六进制为0x80000000),那么可以推断出其反码是32个1,则源码是1三十一个零,即-0,所以-0就是  负的最大正整数减一  ,-0的源码和补码相同。

那么为什么最小的负数是  负的最大正整数-1,为什么不能是负的最大正整数-2,或者减3......,因为通过计算,负的最大正整数的补码+负二的补码=0后面跟三十一个1,变成了最大的正整数。显然是不对的,同一个补码只能表达一种含义,减3同理,所以就规定最小的负数为负的最大正整数-1。