租房中,偶遇一朋友也是计算机行业的。闲聊中,可能由于互相探讨下的原因,被考量一番,问了我一个简单的问题 : 整型数据的宽度是多少?
各位看客先别笑,我第一个回答是。。。。255。说实话,这个回答确实很扯淡,当时,自己心里想着的也不知道是什么浮云。立马,一秒钟之后,答案又成为了
8位。。。。。。。当时没反应过来。记得当时,那位朋友和我闲聊扯到计算机的发展,扯到总线地址,自己都没反应过来。后来,刚分开没几分钟,发现,自己
似乎回答的很扯淡。立马当时自己脑海中第一个反应,一个整型数据2个字节,一个字节8位,应该是16位位宽。。。然后,似乎问了几个朋友,得到不同的信息,
自己查了下资料,想做一个总结,留给自己去反省。
/*********************************我是分割线*****************************************/
1.整数类型
C语言提供了多种整数类型,用以适应不同情况的需要。常用的整数类型有:整型、长整型、无符号整型和无符号长整型等四种基本类型。不同类型的差别就在于采用不同位数的二进制编码方式,所以就要占用不同的存储空间,就会有不同的数值表示范围。表3-1列出了常用的基本整数类型和有关数据。
在数学中,整数是一个无限的集合,即整数的表示范围为-∞~+∞。C语言标准本身也并不限制各种类型数据所占的存储字节数。但在计算机中,所有数值的取值范围受限于机器所能表示的范围,不同的计算机系统对数数据的存储有具体的规定。表3-1列出了IBM PC机及其兼容机上对C语言整型数的规定,表中的存储字节数和最小数值范围表示相应类型的整数不能低于此值但可高于此值。
表3-1 整数基本类型表
整数类型 存储字节 最小数值范围
整型 2字节 -32768~32767
长整型 4字节 -2147483648~2147483647
无符号整型 2字节 0~65535
无符号长整型 4字节 0~4294967295
计算机内部总是采用二进制补码形式表示一个数值型数据,所以对于带符号的数,其负数的表示范围比正数大,请读者注意这一点。表3-2中的整型和长整型均表示带符号的整型数据,一个带符号整数和无符号整数在计算机中的存储形式是不同的,其示意图如图3-1所示。例如,长整型不可少于四个字节,但可以是八个字节。
![]() |
图中的整型数和无符号整型数都是用两个字节(16位二进制数)表示,整型数的最高位为符号位,"1"表示负数,"0"表示正数,用其余15位表示数值。而无符号整型数全部16位表示数值。
2.整型常量
在计算机语言中,常量一般是以自身的存在形式直接表示数据属性,C语言亦如此。例如:-35是十进制整型常数,应占两个字节的存储空间,而-35.0是十进制实型常数,占四个字节的存储空间。
在C语言中,所有的数值型常量都带有符号,所以整型常量只区别整型和长整型两种形式,而没有无符号值型常量。整型和长整型常量均可用十进制、八进制和十六进制三种形式表示。
(1) 十进制整型常量
十进制整型常量的形式是有效的十进制数字串。如:123,-123,8,0,-5,30000等。40000则不是一个十进制整型常量,因为它超过了整型常量的表示范围。对于这种超过数值表示范围的数据,语言系统会自动将其转换为其它适合的类型。
(2) 八进制整型常量
八进制整型常量的形式是以数字"0"开头的八进制数字串。数字串中只能含有0~7这八个数字。
如:056 表示八进制数56,等于十进制数46。
-017 表示八进制数-17,等于十进制数-15。
(3) 十六进制整型常量
十六进制整型常量的形式是以数字0x或0X开头的十六进制字符串。字符串中只能含有0~9这十个数字和a、b、c、d、e、f(或大写的A、B、C、D、E、F)这六个字母。这一规定与计算机领域中通行的表示十六进制字符方式相同。
如:0x123 表示十六进制数123,等于十进制数291。
0x3A 表示十六进制数3A,等于十进制数58。
-0x2e 表示十六进制数-2f,等于十进制数-46。
以上是整型常数的表示,对于长整型常数同样可以用十进制、八进制和十六进制三种形式表示。其表示形式是在常数之后加上字母"l"或"L"。例如: 123L,-1234567L,0l,32769L,-017l,-0x123BL,0Xf3acL,-0x2eL都是长整型常数。
长整型常数在计算机中占4个字节,数的表示范围可达到-2147483648~2147483647。所以尽管40000不是一个合法的十进制整型常量,但40000L是一个合法的十进制长整型常量。长整型常数一般是用于函数调用中。
3.整型变量
在C语言中,整型变量有上述整型数据所具有的四种类型:整型、长整型、无符号整型和无符号长整型。整型变量以关键字int作为基本类型说明符,另外配合4个类型修饰符,用来改变和扩充基本类型的含义,以适应更灵活的应用。可作用于基本型int上的4个类型修饰符有:
long 长
short 短
signed 有符号
unsigned 无符号
这些修饰符与int可以组合成如表3-2所示的不同整数类型,这是ANSI C标准允许的整数类型。由表中可见,有些修饰符是多余的,例如修饰符signed和short就是不必要的,因为signed int、short int、signed short int与int类型都是等价的。提出这些修饰符只是为了提高程序的可读性。因为signed与unsigned对应,short与long对应,使用它会使程序看起来更加明了。
表3-2 ANSI标准规定的整型变量属性表
数据类型 占用字节数 二进制位 取值范围
int 2 16 -32768~32767
short [int] 2 16 同 int
long [int] 4 32 -2147483648~2147483647
signed [int] 2 16 同 int
signed short [int] 2 16 同 int
signed long [int] 4 32 同 long int
unsigned [int] 2 16 0~65535
unsigned short [int] 2 16 同 unsigned int
unsigned long [int] 4 32 0~4294967295
前面已经提到,一个C程序中用到的所有变量都必须在使用前进行变量说明。一是说明变量类型,二是说明变量名。对于程序中要说明为整型的变量,只需在说明语句中指明整型数据类型和相应的变量名即可。
例如:int a,b,c; /* 说明 a,b,c 为整型变量 */
long e,f; /* 说明e,f 为长整型变量 */
unsigned short g,h; /* 说明g,h 为无符号短整型变量 */
signed int x,y; /* 说明x,y,z为带符号整型变量,其作用同int x,y */
4.整型数据应用中的几个问题
整型数据在使用中应注意以下几个问题:
(1) 变量要先定义后使用;
(2) 数据溢出;
(3) 常量与变量的类型要匹配。
下面通过一个简单的程序实例讨论以上三个问题。
例3-1:编写求两数和的C程序并上机运行。程序如下:
/* SUM.C源程序 */
main() /* 求两数和主函数 */
{
int a,b; /* 说明a、b为整型变量 */
a=32767; /* 为变量a赋最大值 */
b=3; /* 为变量b赋值 */
c=a+b; /* 计算a+b并将结果赋值给变量c */
printf("c=%d\n",c); /* 输出变量c的值 */
}
讨论1:在Turbo C2.0开发环境下运行此程序时,编译过程中提示有一个错误,信息窗口显示如图3-2所示的错误信息,说明源程序第五行有错,错误原因是主程序中的变量C没有定义。编辑窗口源程序反相显示出第五行,见图3-3所示。分析错误原因可知,程序第五行并没有错,而是在使用变量c之前没有定义其类型,修改程序第二行为:
int a,b,c;
重新编译即可通过。可见,C程序中的所有变量都必须先定义后使用。
![]() |
讨论2:由SUM.C源程序可见,该程序的运行结果应该是:c=32770,可实际运行结果如下:
c=-32766
![]() |
显然这个结果是错误的,但系统没有提示出错。为什么会出现这种情况呢?图3-4是该程序运行后变量a、b、c中的存储情况。由图中可见,a和b的值都没有超出整型数的表示范围,而a加b后应得到32770,这个数已经超出了整型数的表示范围,称为溢出。但这种溢出在内存变量c中的表现形式正好是数值-32766的补码形式,当输出变量c的内容时自然就输出了-32766,造成结果错误。这就是数据溢出导致的结果。对于这种问题,系统往往不给出错误提示,而是要靠正确使用类型说明来保证其正确性。所以要求对数据类型的使用要仔细,对运算结果的数量级要有基本估计。
![]() |
如果把上述程序作以下修改:
/* SUM.C源程序 */
main()
{long a,b,c; /* 说明a、b、c为长整型变量 */
a=32767;
b=3;
c=a+b;
printf("c=%ld\n",c); /* 按长整型格式输出变量c的值 */
}
即把变量a、b、c定义为长整型,就可以得到正确的运行结果。请读者思考:如果只把c定义为长整型,a和b还保持整型,结果会怎样?
讨论3:在C程序中,要注意常量与变量的类型匹配问题,例如上述程序中变量c的结果是正整数32770,与之匹配的有long int型,还有unsigned int、unsigned short int和unsigned long int等所有无符号整型,因为32770是正数,又没有超出所有无符号整型数的表示范围。而int或short int型是不能与之匹配的,否则会产生溢出。
摘引自:http://eol.bit.edu.cn/jpkc/2006/c/skja/ch03/se02-1.htm
/****************************************************************************************/