C语言中的int类型的范围是由什么决定的
变量范围是-32,768 to 32,767 或者 -2,147,483,648
测试int变量的字节数:
#include #include int main() { printf("Storage size for int : %d
", sizeof(int)); return 0;}
结果:Storage size for int : 4
说明int型变量占用4个字节。
printf("int类型的最大值:%d
",INT_MAX); printf("int类型的最小值:%d
",IN。
在计算机中,整数类型是以补码形式存储的。32位二进制全部都是1的补码,用来表示-1。关于补码的知识,请你另行查找资料。
无符号整数是用来存储非负整数的一种数据格式,以四位二进制为例,他能表示的最小值是0000表示0,最大值是1111对应的是十进制15。
an integer, typically reflecting the natural size of integers on the host machine
意思是反映了机器整数类型的 natural size,可是,
这个 natural size 又是什么意思呢?
书中后来在谈到 short, int, long 的关系时,又说,这些类型由编译器根据机器自由选择合适的大小,但是 short 和 int 至少 16 位,long 至少 32 位。
这里的问题是
编译器是根据什么决定类型大小呢?
后面书中又提到,这些类型啊,在<limits.h>中都有,我就在ubuntu下查看了 /usr/include/limits.h,里面确实提到
/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
但是,这也是一种定义,还是没有说出为什么,我现在想知道的是
为什么
于是,我想起了那些年扫过的 《深入理解计算机系统》,英文名叫 Computer Systems: A Programmer's Perspective,速查之!
在2.1节的开头提到,字节(byte)是最小可寻址单位,大多数计算机使用8位的块。 啊,8位,那位又是什么呢?嗯,位是一种存储结构,一个位只能存储0或者1。
后面2.1.2节中提到
每台计算机都有一个字长(word size),指明了整数和指针数据的 nominal size。
指针是什么,指针就是内存中的地址啊,假如字长为w位,那么地址的数目就是2^w个啊,那一个地址代表多大内存呢?
前面说了,字节(byte)是最小可寻址单位,所以一个地址代表一个字节。当字长是w位时,地址数目2^w个,共有2^w个字节的内存空间。
如果计算机字长为32,即传说中的32位计算机,那么它可以表示的内存空间就是 2^32 个字节,这就是传说中的4G啊!
现在我们是由字长32位,也就是整数的大小32位,推出了内存空间4G。我现在在想:
是不是一开始是决定内存空间是4G,所以才定下了字长32位的规矩,由此,机器的natural size是32位, 所以,编译器才将C语言中int类型才是32位呢?
可是我没有证据啊!
没有证据就尝试推理一下吧。
我们知道32位机器是由16位机器扩展来的,那为什么要扩展机器字长呢?这个问题原因之一,我们刚才已经解释过了,如果不扩展,那么机器最大寻址空间就比较小,即使我给你一个大内存,你也用不上啊。这可能这也今天我们从32位转到64位的原因吧。
所以,现在我们明白了,由于我们想要更大的内存地址空间,所以就将字长从16位提升为32位,而字长代表着指针和整数类型的大小,所以最终整数类型就是32位了。
不过这里还有不少问题。
字长这东西只是个抽象的概念,方便我们描述机器的一些属性,暂时不谈。
先说指针。对于机器来说,哪里有什么指针的概念,指针是C语言中的东西,编译成汇编后就没指针这个概念了。但是,指针表示的是内存的地址,而内存的地址又和机器中的什么部件相关呢?
再说整数。到汇编这一层,整数的概念还存在吗?整数的概念应该是和汇编中的算术指令相关,那么算术指令又和机器中的什么部件相关呢?
最后,指针是表示内存地址啊,我们有了更大内存,那么内存地址需要更长的位来表示是可以理解的,可是,这关你整数什么事啊?我内存地址32位,整数16位不行吗?
其实,总的问题就是
字长都与机器的什么部件相关
要解释这个问题,我们发现自己不由自主地来到了《深入理解计算机系统》的第四章“处理器体系结构”。
这一章以一种叫Y86的处理器介绍了处理器体系结构的方方面面。首先介绍了寄存器,寄存器是一种存储部件,存储什么?存储信息,存储信息用来做什么呢?用来计算。我们在C语言中使用一个简单的加法计算,在处理器这一层,就需要使用寄存器来帮助我们计算。我们把一个简单的C语言编译成汇编看看。
/* test_add.c */
#include <stdio.h>
int main(void) {
int a = 1;
int b = 2;
int c = a + b;
return 0;
}
使用 GCC 编译一下
gcc -S test_add.c -o test_add.s
然后查看一下主要代码。
movl $1, -12(%ebp)
movl $2, -8(%ebp)
movl -8(%ebp), %eax
movl -12(%ebp), %edx
addl %edx, %eax
movl %eax, -4(%ebp)
其中的 ebp eax edx 就是寄存器。
可以看出,数据先放到栈里,再从栈里放到寄存器里,然后再进行加法运算,最后再从寄存器里把结果放回栈里。
下面的图是书中给出的一个处理器的抽象视图:
栈是什么?栈是一种抽象概念,这里的栈就是指内存。
书里说了,在32位计算机中,这些寄存器的大小就是32位。可见,
字长与寄存器大小一样
除此之外,我们可以看到,需要计算的时候,movl 指令将数据从内存中放到寄存器里,由于内存和寄存器是不同的部件,所以需要一个部件来传递数据,这种部件叫做数据总线。
寄存器的大小与字长相同,那么这种数据总线每次能传送的数据也应该与字长相同,所以:
字长与数据总线宽度一样
另外,再想像一下,你想要从内存中取数据出来,总要告诉内存你取的是哪个地址的数据吧,所以,“地址”这个数据也是要从某个地方传送到内存的。只要传递,就需要有部件支持,这个部件叫做地址总线,地址总线传递地址,地址大小与字长一样,那么,我们可以知道:
字长与地址总线宽度一样
好了,到了这里,我们的分析就差不多了,总结一下:
我们由C语言中int类型的大小,得到了字长这个概念,又从字长这个概念寻找了与其相关的一些机器部件的属性。到现在为此,与字长相关的有:
int 类型
指针(即内存地址)
寄存器
数据总线
地址总线
在 Wikipedia 的 Word(computer_architecture)词条中,我们可以看到自1837年以来,一系列计算机体系结构中与字长相关的一些属性的变化。
我们再想想,为什么要将这么多种部件都设置成相同长度?我想,可能是因为计算机内部实在太复杂了,各个部件之间需要紧密地配合,共同完成复杂的任务。尤其是数据,需要在各个部件之间传递,如果这些部件之间大小不统一,就会增加机器的复杂度,由于,我们将这些部件大小尽可能统一,进而提出字长这种概念来描述计算机的重要性质。
到这里,我们再想一下,字长这个概念和这么多部件相关,那么确定字长多大应该不仅仅与内存大小有关系。比如字长代表寄存器的大小,寄存器与机器的运算直接相关,字长变大后,每次能参与计算的值也相应变大,以前我们计算两个很大的数的和时,可能需要动用好几个寄存器,现在咱字长大了,寄存器也大了,只需要两个寄存器就可以了。
由此可见,字长的确定是一个综合的考量,代表着计算机计算,存储能力的全面提升。
@兄弟连IT教育北京总校
那为什么64位机器int类型还是32位呢
由编译器决定。
int的取值范围怎么算
nt类型在内存中占用了4个字节,也就是32位。int类型是有符号的,因此,32位并不会全部用来存储数据,使用最高位来存储符号,最高位是0,提示数据是正数,最高位是1,表示数据是负数,使用其他的31位来存储数据。C语言没有规定各种整数类型的表示范围,也就是说,没有规定各种整数的二进制编码长度,...
int范围有哪些?
整数类型的范围 在计算机编程中,int类型是一种基本的数据类型,用于表示整数。这个范围取决于具体的编程语言和计算机架构。一般来说,int类型能够表示从负的最大整数到正的最大整数的所有数值。这个范围通常是固定的,但在某些情况下,如使用长整型时,范围可能会更大。负整数范围 int类型的负整数范围是...
c语言中int取值范围为16位指的是什么16位
在C语言中,int数据类型通常占用16位来存储数值,这表示它可以表示的范围。每个位对应二进制中的一个0或1,其中左边第一位作为符号位,0代表正数,1代表负数。具体数值范围取决于是否考虑符号位:如果只计算正数,则范围从0000 0000 0000 0001(二进制的1)到0111 1111 1111 1111(二进制的32767),这...
C语言中。int 取值范围
在C语言中,int类型占据2个字节,即16位。在计算机中,16位的二进制数可以表示的范围是从00000000 00000000到11111111 11111111。其中,int类型是有符号整数,它的最大值是01111111 11111111,转换为十进制为2的15次方减1,即32767。这是因为在二进制中,最高位被用来表示符号,0表示正数,1表示负数。
c语言的int型数据范围和内存中存储是什么?
1、nt型为带符号整数类型,对于16位编译器,int占2字节8位;对于32位和64位编译器,int型占4字节32位。不同的占用空间,int型的范围也不同:2字节时,int 范围为-32768~32767;4字节时,int范围为-2147483648~2147483647。无论是哪种存储方式,均是最高位为符号位,0代表正数,1代表负数。剩余位...
c语言中int,long的取值范围是多少?为什么是这么多?(32位机)
在32位计算机系统中,C语言中int的取值范围通常是-2147483648到2147483647,long的取值范围通常是-9223372036854775808到9223372036854775807。解释:在32位计算机系统中,数据类型的大小和取值范围是由计算机的内存结构和二进制表示方式决定的。1. int类型:在大多数32位系统中,int类型通常占据4个字节的内存空间。
关于int的取值范围
在编程语言C中,int数据类型的取值范围主要取决于其所占用的位数:在标准配置下:int占用4字节,即32位,其取值范围为2,147,483,648到2,147,483,647,具体表示为2^31到2^311。在小型计算机或某些嵌入式系统中:int可能占用2字节,即16位,这时其取值范围会缩小为32,768到32,767,对应的范围是2^...
C++语言中int是只能是整数吗?float只能是小数还是其他的什么?求可以...
int型,就是整型数(这里不讨论前缀),范围是-2^31~2^31。int只能是整数,即,如果你声明了一个int a,你把1赋值给a,则a就会等于1。而如果你把1.4赋给a,a还是等于1;把1.9赋给a,a仍然是等于1。因此整型数只会保存所给数据的整数部分,小数部分是直接忽略,而不是四舍五入。float型单...
int取值范围
而在32位和64位机器中,int占32位,取值范围为-2147483648~2147483647(-2^31~2^31-1)。ISO\/ANSIC规定,int类型的最小范围为-32768到32767。在C语言中,int类型用于表示整数值,int类型通常占用4个字节(32位),在不同的系统和编译器中会有所不同。在C语言中,不同类型的变量之间可以进行类型...
float 范围
当涉及到编程中的数据类型表示时,我们经常会遇到int和float这两种基本数据类型。int,全称为整型,用于存储整数,其范围通常由编程语言的实现决定,这可能包括正负整数,但有限制。例如,在C语言中,int类型的整数范围可能从-2,147,483,648到2,147,483,647,具体取决于编译器设置。相比之下,float类型...