在面试的时候被问到这个问题,因此就钻了牛角尖一下,在这把查到的结果记一下。面试
一、首先,查了一下网上的资料。.net
http://blog.csdn.net/lyl0625/article/details/7350045设计
http://atzishi.blog.163.com/blog/static/210838180201301910533629/blog
虽然有不少中答案,可是都说不许究竟是多少字节。 文档
2. 《C程序设计语言》第2.2节 数据类型及其长度get
C语言中只提供了下列几种基本类型数据:编译器
char 字符型,占用一个字节,能够存放本地字符集中的一个字符。it
int 整型,一般反映了所用机器中整数的最天然的长度。io
float 单精度浮点型编译
double 双精度浮点型
此外,还能够在这些基本的数据类型前面加上一些限定符。short和long两个限定符用与限定整型:
short int sh;
long int counter;
在上述这种类型的声明中,关键字int能够省略。一般不少人也习惯这么作。
short与long两个限定符的引入能够为咱们提供知足实际须要的不一样长度的整型数。int一般表明特定机器中整数的天然长度。short类型一般为16位,long类型一般为32位,int类型能够为16位或32位。各编译器能够更具硬件特性自主选择合适的类型长度,但要遵循下列循环限制:short与int类型至少为16位,而long类型至少为32位,而且short类型不得长与int类型,而int类型不得长于long类型。
3. 《C++程序设计语言》附录C.2标准
标准中把许多重要事项宣布为由实现定义。这也意味着每一个实现必须有为该种结构提供一个特定的,定义良好的行为方式,并必须将它写入文档。例如,
unsigned char c1 = 64; // 有良好定义:char至少有8位,总能保存64
unsigned char c2 = 1256; // 实现定义的:若是char只有8位就会出现截断
c1的初始化具备良好的定义,由于一个char至少必须有8位。而对c2初始化的行为就要由实现定义,由于char的确切位数由实现定义。若是char只有8位,那么值1256就会被截断到232(C.6.2.1)。由实现定义的大部分特征都与用与运行程序的硬件特征有关。
在写程序的时候,一般都须要依赖与某些由实现定义的行为。这种行为是咱们为了能在大范围的系统之上有效操做所必须付出的代价。例如,若是全部的char都是8位,并且全部整数都是32位,这个语言就会简单许多。可是,16位和32位的字符也很常见,整数也可能更大而没法放入到32位中。例如,今天的许多计算机都有着超过32G字节的磁盘,表示磁盘地址就须要32位或者64位的整数。
4. C99的标准
ISO/IEC1989 或ISO/IEC9899:1999 里面的5.2.4.2.1节里面有说各类int类型的尺寸
Their implementation-defined values shall be equal or greater in magnitude (absolute value) to those shown, with the same sign.
— 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
5 总结
标准只规定了:short >= 16 Bytes, long >= 32 Bytes, int >= short && int <= long。因此,面试的时候若是被问到这个问题,若是没有专门深究过,真的很难回答出来。