整型数据详解

整型数据详解本文详细介绍了 C 语言中整型常量和变量的表示方式 包括十进制 八进制和十六进制 以及它们在内存中的存储结构

大家好,欢迎来到IT知识分享网。

1 整型常量的表示方法

整型常量即整常数。C整常数可用以下三种形式表示:

(1)十进制整数。如123,-456,0.

(2)八进制整数。以数字0开头的数是八进制数。如0123表示八进制数123,即(123),,其值为:1X8*+2X8′ +3X8°,等于十进制数83。-011表示八进制数-11,即十进制数-9。

(3)十六进制整数。以0x开头的数是十六进制数。如0x123,代表十六进制数123,即(123)=1×162+2×161+3X160=256+32+3=291,-0x12等于十进制数-18。

2 整型变量

1.整型数据在内存中的存放形式

数据在内存中是以二进制形式存放的。如果定义了一个整型变量i:

int i; /*定义为整型变量*/

i=10; /*给i赋以整数10*/

十进制数10的二进制形式为1010,在微机上使用的C编译系统,每一个整型变量在内存中占2个字节。图3.2(a)是数据存放的示意图。图3.2(b)是数据在内存中实际存放的情况。

整型数据详解

实际上,数值是以补码(complement)表示的。一个正数的补码和其原码的形式相同。图3.2(b)就是用补码形式表示的。如果数值是负的,在内存中如何用补码形式表示呢?求负数的补码的方法是:将该数的绝对值的二进制形式,按位取反再加1。例如求 -10 的补码:①取-10的绝对值 10;②10的绝对值的二进制形式为1010;③对1010取反得 10101(一个整数占16位);④再加1得10110,见图3.3。

整型数据详解

可知整数的16位中,最左面的一位是表示符号的,该位为0,表示数值为正为1数值为负。关于补码的知识不属于本书的范围,但学习C语言的读者应该比学习其他高级语言的读者对数据在内存中的表示形式有更多的了解。这样才能理解不同类型数据间转换规律。

2.整型变量的分类

整型变量的基本类型符为int。可以根据数值的范围将变量定义为基本整型、短整型或长整型。在int之前可以根据需要分别加上修饰符(modifier):short(短型)或long(长型)。因此有以下三种整型变量:

(1)基本整型,以int表示。

(2)短整型,以short int 表示,或以short表示。

(3)长整型,以long int 表示,或以long表示。

在 TurboC中,一个int型变量的值的范围为一215-(215一1),即-32768~3277,在实际应用中,变量的值常常是正的(如学号、库存量、年龄、存款额等)。为了充分利用麦量的表数范围,此时可以将变量定义为“无符号”类型。对以上三种都可以加上修饰符 unsigned,以指定是“无符号数”。如果加上修饰符signed,则指定是“有符号数”。如果既不指定为signed,也不指定为unsigned,则隐含为有符号(signed)。实际上signed是完全可以不写的。归纳起来,可以用以下6种整型变量。即:

有符号基本整型 [signed]int

无符号基本整型 unsigned [int]

有符号短整型 [signed] short [int]

无符号短整型 unsigned short [int]

有符号长整型 [signed] long [int]

无符号长整型 unsigned long [int]

如果不指定unsigned 或指定signed,则存储单元中最高位代表符号(0为正,1为负)。如果指定 unsigned,为无符号型,存储单元中全部二进位(bit)用作存放数本身,而不包括符号。无符号型变量只能存放不带符号的整数,如123、4687等,而不能存放负数,如-123、-3。一个无符号整型变量中可以存放的正数的范围比一般整型变量中正数的范围扩大一倍。如果在程序中定义a和b两个变量:

int at

unsigned int b;

则变量a的数值范围为-32768~32767。而变量b的数值范围为0~65535。图3.4(a)表示有符号整型变量a的最大值(32767)。图3.4(b)表示无符号整型变量b的最大值

(65535)。

C标准没有具体规定以上各类数据所占内存字节数,只要求long型数据长度不短于int型,short型不长于int型。具体如何实现,由各计算机系统自行决定。如在微机上,

整型数据详解

int和short 都是16位,而long是32位。在VAX750上,short是16位,而int和long都是32位,一般以一个机器字(word)存放一个int数据。前一阶段,微机的字长一般为16位,故以16位存放一个整数,但整数的范围太小,往往不够用,故将long型定为32位。而 VAX的字长为32位,以32位存放一个整数,范围可达正负21亿,已足够用了,不必再将 long型定为64位。所以将int和long都定为32位。通常的做法是:把long定为32位,把short 定为16位,而int可以是16位,也可以是32位。这主要取决于机器字长。

表3.1列出ANSI标准定义的整数类型和有关数据。表中所列出的“最小取值范围”是指不能低于此值,但可以高于此值。例如,允许有的C编译系统规定一个整型数据占4个字节(32位),其取值范围为一~。TurboC的规定是完全与表3.1一致的。

整型数据详解

方括弧内的部分是可以省写的。例如,signed short int与short 等价,尤其是signed是完全多余的,一般都不写signed。

一个整数(以13为例)在存储单元中的存储情况,见图3.5所示(假设使用的是微机上的C编译系统,如Turbo C、MS C)。

3.整型变量的定义

前面已提到,C规定在程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。这是和BASIC,FORTRAN不同的,而和PASCAL相类似。例如:

int a,b; (指定变量a、b为整型)

unsigned short c,d; (指定变量c、d为无符号短整型)

long e,f; (指定变量e,f为长整型)

整型数据详解

对变量的定义,一般是放在一个函数的开头部分的声明部分(也可以放在函数中某分程序内,但作用域只限它所在的分程序)。

例3.2 整型变量的定义与使用。

main()

{int a,b,c,d; /*指定a、b、c、d为整型变量*/

unsigned u; /*指定u为无符号整型变量*/

a=12;b=-24;u=10;

c=a+u;d=b+u;

printf(“a+u=%d,b+u=%d\n”,c,d);

}

运行结果为

a+u=22,b+u=-14

可以看到不同种类的整型数据可以进行算术运算。在本例中是int型数据与 signed int型数据进行相加相减运算(有关运算的规则在本章3.7节中介绍)。

4.整型数据的溢出

在urboC中一个int型变量的最大允许值为32767,如果再加1,会出现什么情况?

例3.3 整型数据的溢出。

main()

{int a,b;

a=32767;

b=a+1;

printf(“%d,%d”,a,b);

}

运行结果为32767,-32768

整型数据详解

从图 3.6可以看到:变量a的最高位为0,后15位全为1。加1后变成第1位为1,后面15位全为0。而它是一32768的补码形式,所以输出变量b的值为一32768。请注意:一个整型变量只能容纳一32768~32767范围内的数,无法表示大于32767的数。遇此情况就发生“溢出”,但运行时并不报错。它好像汽车的里程表一样,达到最大值以后,又从最小值开始计数。所以,32767加1得不到32768,而得到一32768,这可能与程序编制者的原意不同。从这里可以看到:C的用法比较灵活,往往出现副作用,而系统又不给出“出错信息”,要靠程序员的细心和经验来保证结果的正确。将变量a和b改成long型,并按%ld格式输出,就可得到预期的结果32768。

3 整型常量的类型

我们已知整型变量可分为int、 short int、 long int 和 unsigned int 、unsigned short、 unsigned long等类别。那么常量是否也有这些类别?在将一个整型常量赋值给上述几种类别的整型变量时如何做到类型匹配?请注意以下几点:

(1)一个整数,如果其值在一32768~+32767范围内,认为它是int型,它可以赋值给int 型和long int型变量。

(2)一个整数,如果其值超过了上述范围,而在-~+范围内,则认为它是长整型,可以将它赋值给一个long int型变量。

(3)如果某一计算机系统的C版本(例如TurboC)确定short int与int型数据在内存中占据的长度相同,则它的表数范围与int 型相同。因此,一个int型的常量也同时是一个short int型常量,可以赋给int型或short int型变量。

(4)一个整常量后面加一个字母u或U,认为是unsigned int型,如12345u,在内存中按 unsigned int规定的方式存放(存储单元中最高位不作为符号位,而用来存储数据,见图3.4(b))。如果写成一12345u,则先将一12345转换成其补码53191,然后按无符号数存储。(5)在一个整常量后面加一个字母1或L,则认为是longint型常量。

例如 1231、432L、0L等,这往往用于函数调用中。如果函数的形参为long int型,则要求实参也为long int型。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/121369.html

(0)
上一篇 2025-10-24 07:20
下一篇 2025-10-24 07:33

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信