您的位置:首页 > 编程语言 > C语言/C++

C语言-数据类型(整型)

2012-07-07 18:04 288 查看
程序中使用的各种变量都应预先加以说明,即先说明,后使用。对变量的说明可以包括三个方面:

·数据类型·存储类型·作用域。所谓数据类型是按被说明量的性质,表示形式,占据存储空间的多少,构造特点来划分的。在C语言中,数据类型可分为:基本数据类型、构造数据类型、指针类型、空类型。

基本数据类型:其值不可以再分解为其他类型。它包括:整形、实形(浮点形(单精度、双精度))、字符形、枚举形。

构造数据类型:包括数组类型、结构体类型、共用体类型。

对于基本数据类型量,按其取值是否可改变又分为常量和变量两种。在程序执行过程中,其值不发生改变的量称为常量,取值可变的量称为变量。它们可与数据类型结合起来分类。例如,可分为整型常量、整型变量、浮点常量、浮点变量、字符常量、字符变量、枚举常量、枚举变量。在程序中,常量是可以不经说明而直接引用的,而变量则必须先说明后使用.

常量和符号常量

直接常量(字面常量): 整型常量:12、0、-3; 实型常量:4.6、-1.23; 字符常量:‘a’、‘b’

符号常量:用标示符代表一个常量。在C语言中,可以用一个标识符来表示一个常量,称之为符号常量。

符号常量在使用之前必须先定义,其一般形式为:#define 标识符 常量

其中#define也是一条预处理命令(预处理命令都以"#"开头),称为宏定义命令,其功能是把该标识符定义为其后的常量值。一经定义,以后在程序中所有出现该标识符的地方均代之以该常量值。 习惯上符号常量的标识符用大写字母,变量标识符用小写字母,以示区别。

#define PRICE 30

int main(void)

{ int num,total;

num=10;

total=num* PRICE;

printf(“total=%d”,total);

return 0;

}

整形常量

最后一点很重要,C/C++中,10进制数有正负之分,比如12表示正12,而-12表示负12,;但8进制和16进制只能用来表达无符号的正整数,如果你在代码中里:-078,或者写:-0xF2,C,C++并不把它当成一个负数。

-------------------------------

#include <stdio.h>

int main(void)

{

int i = -3 ;

printf("0x%x\n", i);

return 0;

}

打印的是 0xfffffffd;

int main(void)

{

int i = 0xfffffffd;

printf("%d\n", i);

return 0;

}

打印的是 -3

-------------------------

1.八进制整常数八进制整常数必须以0开头,即以0作为八进制数的前缀。数码取值为0~7。八进制数通常是无符号数。

以下各数是合法的八进制数:

015(十进制为13) 0101(十进制为65) 0177777(十进制为65535)

以下各数不是合法的八进制数:

256(无前缀0) 03A2(包含了非八进制数码) -0127(出现了负号)

A.八进制与二进制的转换

二进制转换到八进制

方法是:只要将二进制数从小数点开始,整数部分从右向左3位一组,小数部分从左向右3位一组(不足3位补零)。例: (110110.0011 )2=(110 110.001 100 )2=( 66.14 )8 (不足部分用零补足3位)

八进制数转换成二进制数

 八进制数转换成二进制数的方法:每位八进制数用3位二进制数代替。

例:(12.34)8 = (001 010.011 100 )2

B.八进制与十进制之间的转换

八进制转换为十进制

八进制就是逢8进1。八进制数采用 0~7这八数来表达一个数。八进制数第0位的权值为8的0次方,第1位权值为8的1次方,第2位权值为8的2次方……所以,设有一个八进制数:1507,转换为十进制为:用竖式表示:1507换算成十进制。

第0位 7 * 80 = 7

第1位 0 * 81 = 0

第2位 5 * 82 = 320

第3位 1 * 83 = 512 +

--------------------------

839

同样,我们也可以用横式直接计算:

7 * 80 + 0 * 81 + 5 * 82 + 1 * 83 =
839 

结果是,八进制数 1507 转换成十进制数为 839

十进制转换为八进制:

何将十进制数120转换成八进制数。

用表格表示:

被除数计算过程余数
120120/8150
1515/817
11/801
120转换为8进制,结果为:170。

八进制数与十六进制的转换

  方法:利用常规转换方法,可以先把八进制转换为十进制或二进制,再转换成十六进制。

  例:(34.21)8=(011 100.010 001)2=(0001
1100
.0100 0100)2=(1C.44)16

(24)8=(20)10=(14)16

(3A.52)16=(0011 1010.0101 0010)2=(000
111 010
.010 100 100)2=(72.244)8

(59)16=(89)10=(131)8

2.十六进制整常数

十六进制整常数的前缀为0X或0x。其数码取值为0~9,A~F或a~f。

以下各数是合法的十六进制整常数:

0X2A(十进制为42)  0XA0 (十进制为160)  0XFFFF (十进制为65535)

以下各数不是合法的十六进制整常数:

5A (无前缀0X)  0X3H (含有非十六进制数码)

A:十六进制转换为十进制

2进制,用两个阿拉伯数字:0、1;8进制,用八个阿拉伯数字:0、1、2、3、4、5、6、7;10进制,用十个阿拉伯数字:0到9;16进制,用十六个阿拉伯数字……等等,阿拉伯人或说是印度人,只发明了10个数字啊?

16进制就是逢16进1,但我们只有0~9这十个数字,所以我们用A,B,C,D,E,F这五个字母来分别表示10,11,12,13,14,15。字母不区分大小写。十六进制数的第0位的权值为16的0次方,第1位的权值为16的1次方,第2位的权值为16的2次方……所以,在第N(N从0开始)位上,如果是是数 X (X 大于等于0,并且X小于等于 15,即:F)表示的大小为 X * 16的N次方。假设有一个十六进数 2AF5, 那么如何换算成10进制呢?用竖式计算: 2AF5换算成10进制:

第0位: 5 * 160 = 5

第1位: F * 161 = 240

第2位: A * 162 = 2560

第3位: 2 * 163 = 8192 +

-------------------------------------

10997 直接计算就是:5 * 160 + F * 161 + A * 162 +2 * 163 = 10997

(别忘了,在上面的计算中,A表示10,而F表示15) 

现在可以看出,所有进制换算成10进制,关键在于各自的权值不同。

假设有人问你,十进数 1234 为什么是 一千二百三十四?你尽可以给他这么一个算式:

1234 = 1 * 103 + 2 * 102 + 3 * 101 + 4 * 100

十进制转换为十六进制

10进制数转换成16进制的方法,和转换为2进制的方法类似,惟一变化:除数由2变成16。同样是120,转换成16进制则为:

被除数计算过程余数
120120/1678
77/1607
 120转换为16进制,结果为:78。

B:十六进制与二进制的转换二进制和十六进制的互相转换比较重要。不过这二者的转换却不用计算,每个C,C++程序员都能做到看见二进制数,直接就能转换为十六进制数,反之亦然。

首先我们来看一个二进制数:1111,它是多少呢?

你可能还要这样计算:1 * 20 + 1 * 21 + 1 * 22 + 1 * 23 = 1 * 1 + 1 * 2 + 1 * 4 + 1 * 8 = 15。

然而,由于1111才4位,所以我们必须直接记住它每一位的权值,并且是从高位往低位记,:8、4、2、1。即,最高位的权值为23 = 8,然后依次是 22 = 4,21=2, 20 = 1。记住8421,对于任意一个4位的二进制数,我们都可以很快算出它对应的10进制值。

下面列出四位二进制数 xxxx 所有可能的值(中间略过部分)

仅4位的2进制数 快速计算方法 十进制值 十六进值

1111 = 8 + 4 + 2 + 1 = 15 F

1110 = 8 + 4 + 2 + 0 = 14 E

1101 = 8 + 4 + 0 + 1 = 13 D

1100 = 8 + 4 + 0 + 0 = 12 C

1011 = 8 + 4 + 0 + 1 = 11 B

1010 = 8 + 0 + 2 + 0 = 10 A

1001 = 8 + 0 + 0 + 1 = 10 9

....

0001 = 0 + 0 + 0 + 1 = 1 1

0000 = 0 + 0 + 0 + 0 = 0 0

二进制数要转换为十六进制,就是以4位一段,分别转换为十六进制。

如(上行为二制数,下面为对应的十六进制):

1111 1101 , 1010 0101 , 1001 1011

F D , A 5 , 9 B  

反过来,当我们看到 FD时,如何迅速将它转换为二进制数呢?

先转换F:看到F,我们需知道它是15(可能你还不熟悉A~F这五个数),然后15如何用8421凑呢?应该是8 + 4 + 2 + 1,所以四位全为1 :1111。接着转换 D:看到D,知道它是13,13如何用8421凑呢?应该是:8 + 2 + 1,即:1011。所以,FD转换为二进制数,为: 1111 1011

由于十六进制转换成二进制相当直接,所以,我们需要将一个十进制数转换成2进制数时,也可以先转换成16进制,然后再转换成2进制。比如,十进制数 1234转换成二制数,如果要一直除以2,直接得到2进制数,需要计算较多次数。所以我们可以先除以16,得到16进制数:

被除数计算过程余数
12341234/16772
7777/16413 (D)
44/1604
结果16进制为: 0x4D2 然后我们可直接写出0x4D2的二进制形式: 0100 1011 0010。同样,如果一个二进制数很长,我们需要将它转换成10进制数时,除了前面学过的方法是,我们还可以先将这个二进制转换成16进制,然后再转换为10进制。下面举例一个int类型的二进制数:01101101 11100101 10101111 00011011我们按四位一组转换为16进制: 6D E5 AF 1B

10进制数转换为2进制数

给你一个十进制,比如:6,如果将它转换成二进制数呢?10进制数转换成二进制数,这是一个连续除2的过程:把要转换的数,除以2,得到商和余数,将商继续除以2,直到商为0。最后将所有余数倒序排列,得到数就是转换结果。

听起来有些糊涂?我们结合例子来说明。比如要转换6为二进制数。 

“把要转换的数,除以2,得到商和余数”。 那么:

要转换的数是6, 6 ÷ 2,得到商是3,余数是0。 (不要告诉我你不会计算6÷3!)

“将商继续除以2,直到商为0……”

现在商是3,还不是0,所以继续除以2。

那就: 3 ÷ 2, 得到商是1,余数是1。 

“将商继续除以2,直到商为0……”

现在商是1,还不是0,所以继续除以2。

那就: 1 ÷ 2, 得到商是0,余数是1 (拿笔纸算一下,1÷2是不是商0余1!)

“将商继续除以2,直到商为0……最后将所有余数倒序排列”

好极!现在商已经是0。我们三次计算依次得到余数分别是:0、1、1,将所有余数倒序排列,那就是:110了!6转换成二进制,结果是110。 

把上面的一段改成用表格来表示,则为:

被除数计算过程余数
66/230
33/211
11/201
(在计算机中,÷用 / 来表示)

1)我们学会了如何将二、八、十六进制数转换为十进制数。

三种转换方法是一样的,都是使用乘法。

2)我们学会了如何将十进制数转换为二、八、十六进制数。

方法也都一样,采用除法。  

3)我们学会了如何快速的地互换二进制数和十六进制数。

要诀就在于对二进制数按四位一组地转换成十六进制数。

在学习十六进制数后,我们会在很多地方采用十六进制数来替代二进制数。

整型变量

整型变量可分为以下几类:

1.基本型

类型说明符为int,在内存中占2个字节,其取值为基本整常数。

2.短整量

类型说明符为short int或short。所占字节和取值范围均与基本型相同。

3.长整型

类型说明符为long int或long ,在内存中占4个字节,其取值为长整常数。

4.无符号型

类型说明符为unsigned。

无符号型又可与上述三种类型匹配而构成:

(1)无符号基本型 类型说明符为unsigned int或unsigned。

(2)无符号短整型 类型说明符为unsigned short

(3)无符号长整型 类型说明符为unsigned long

各种无符号类型量所占的内存空间字节数与相应的有符号类型量相同。但由于省去了符号位,故不能表示负数。 下表列出了Turbo C中各类整型量所分配的内存字节数及数的表示范围。

类型说明符    数的范围     分配字节数

int       -32768~32767     ■■

short int    -32768~32767     ■■

signed int    -32768~32767     ■■

unsigned int   0~65535        ■■

long int  -2147483648~2147483647  ■■■■

unsigned long  0~4294967295     ■■■■

整型变量的说明

变量说明的一般形式为: 类型说明符 变量名标识符,变量名标识符,...; 例如:

int a,b,c; (a,b,c为整型变量)

long x,y; (x,y为长整型变量)

unsigned p,q; (p,q为无符号整型变量)

C 语言中,整数常量默认是十进制(decimal)整数。通过在整数常量前面加上特定的前缀,可以把它设定为八进制或者十六进制整数。前缀
0x 或者
0X 把整数常量设定为十六进制整数。注意,是数字 0 ,而不是字母 O ,别搞错了哦!例如:十进制的 16 用十六进制来表示是 0x10 或者 0X10 。在整数常量前面加上前缀
0 ,表示它是八进制整数。注意,是数字 0 ,而不是字母 O 。例如:十进制的 16 表示为八进制就是 020 。

目前,long long 一般 64 位,long 是 32 位,short 是 16 位,而 int 或者 16 位,或者 32 位。具体某个编译器到底使用多少位来表示这些类型,我们可以用运算符 sizeof 来获取。例如:

printf( "%lu\n", (unsigned long)sizeof(int) * 8 );
/* 输出 int 的位数 */

sizeof 运算符返回其操作数占用空间的大小,以字节(Byte)为单位。注意,C 定义字节的大小为 char 类型的大小。char 通常是 8 位(bit)的,当然也可以更大。

以八进制或者十六进制形式输出数据

使用格式限定符 %o 可以以八进制的形式输出整数。注意,是小写字母 o ,不是数字 0 。使用
%x 或者 %X 可以以十六进制的形式输出整数。小写 x 表示输出使用小写字母,大写 X 表示输出使用大写字母。使用 %#o,%#x 或者 %#X,得到的输出将包括前缀 0,0x 或者 0X。例如:

#include <stdio.h>

int main(void)

{

int x=200;

printf("dec=%d,octal=%o,hex=%x\n",x,x,x);

printf("dec=%d,octal=%o,hex=%X\n",x,x,x);

printf("dec=%d,octal=%#o,hex=%#x\n",x,x,x);

printf("dec=%d,octal=%#o,hex=%#X\n",x,x,x);

return 0;

}这个程序的输出是:

dec=200,octal=310,hex=c8

dec=200,octal=310,hex=C8

dec=200,octal=0310,hex=0xc8

dec=200,octal=0310,hex=0XC8

格式限定符:

%d,%o,%x(%#o,%#x,%#X) int unsigned %u

%hd,%ho,%hx(%#h0,%#hx,%#hX) short int unsigned short %hu

%ld,%lo,%lx(%#lo,%#lx,%#lX) long int unsigned long %lu

八进制数在转义符中的使用

我们学过用一个转义符'\'加上一个特殊字母来表示某个字符的方法,如:'\n'表示换行(line),而'\t'表示tab字符,'\''则表示单引号。今天我们又学习了一种使用转义符的方法:转义符'\'后面接一个八进制数,用于表示ascii码等于该值的字符。

比如,查一下第5章中的ascii码表,我们找到问号字符(?)的ascii值是63,那么我们可以把它转换为八进值:77,然后用 '\77'来表示'?'。由于是八进制,所以本应写成 '\077',但因为c,c++规定不允许使用斜杠加10进制数来表示字符,所以这里的0可以不写。

十六进制数在转义符中的使用

转义符也可以接一个16进制数来表示一个字符。如在6.2.4小节中说的 '?' 字符,可以有以下表达方式:

'?' //直接输入字符

'\77' //用八进制,此时可以省略开头的0

'\0x3f' //用十六进制
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: