bokee.net

其他职业博客

正文 更多文章

1.1 数字的转换和存储——第七课

1.1.1          课前小结

到目前为止,我们学习的C语言知识有

(1)语言的三要素:语法、语义和语用

(2)七个数学运算符,包括五个双目运算符+ - * / %,两个单目运算符-+

(3)六个比较运算符(关系运算符)==  !=  <  > <=  >=

(4)三个逻辑运算符 &&  ||  !

(5)赋值运算符,包括=  +=  -=  *=  /=  %=

(6)自增和自减运算符++ --

(7)四种文字常量:

      整型文字常量,又包括十进制、八进制、十六进制

浮点型文字常量

字符型文字常量

字符串文字常量

(8)四个基本类型名:int char float double

(9)标识符的语法和起名风格

(10)函数的声明和实现

(11)形参和实参

(12)函数和表达式的返回值、返回类型

(13)注释的语法和风格

(14)非十进制化为十进制数字

(15)if语句的基本语法形式

if (判断条件)

   语句块 ;

else

语句块 ;

(16)语句和语句块的概念

1.1.2          除法的实现()

上一课讲述了如何用减法实现除法运算.在被除数里不断减去除数,直到余数小于除数为止.

我们也可以用加法实现除法的求商和取模(求余)运算.将除数不断的累加自身,直到与被除数的差的绝对值小于除数的绝对值为止. 流程如下

(1)设置一个记数器count, 初值为0.

(2)设置一个临时变量dist.记录已经量过的距离.初值为b.

(3)判断|a-dist| < |b|是否成立,如果是,则余数为a-dist,商为count中的当前值,计算结束。否则执行下一步

(4)a,b同号,count自增,a,b异号,count自减.然后在dist中保存已经量过的距离.
       if  (a*b>0)
          ++count;

else if (a*b<0)
           --count;

dist = b *count;
  
上面可以看出,除法的实际意义就是用一个测量单位(除数b)去丈量某个距离(被除数a)的过程,商就是除数累加的次数,余数就是最后一次测量时剩下的距离。

现在再来理解一般的%运算和/运算就好办多了.

-24%-5, 因两数同号,|-24-(-5)| <|-5|,所以将-5不断累加,如下表

累加次数count

dist=b*count

|a-dist|

是否小于|b|

1

-5

19

2

-10

14

3

-15

9

4

-20

4

所以商为4,余数等于-24-(-20) = -4

再看求24%-5的结果,因两数异号,|24-(-5)| >|-5|,将除数不断累减.如下表

累减次数count

dist = *count

|a-dist|

是否小于|b|

-1

5

19

-2

10

14

-3

15

9

-4

20

4

所以商为-4,余数等于24-(20) = 4

1.1.3          开区间和闭区间

以后经常会用到区间的概念,这里简单说一下他们的数学符号.

[a,b] 表示满足a<=x && x<=b的所有数, 叫完全封闭区间.

(a,b) 表示满足a<x && x<b的所有数, 叫完全开区间.

[a,b) 满足a<=x && x<b的所有数, 叫左闭右开区间

(a,b]满足a<x && x<=的所有数, 叫左开右闭区间.

[a,b) (a,b]都叫半开区间或者半闭区间.

课堂练习一

开区间(5,8)包括几个整数?分别是哪些?

区间[5,8]包括几个整数?分别是哪些?

半开区间(5,8]包括几个整数?分别是哪些?

半开区间[5,8)包括几个整数?分别是哪些?

一般的,整数半开区间的元素个数等于两端点之差,开区间等于这个差再减1,闭区间则加1.

[a,b]中的元素个数等于b-a+1

(a,b)中的元素个数等于b-a-1

 [a,b) (a,b]中的元素个数都等于b-a

1.1.4          类型的大小

事物都不是凭空存在的.每个类型的变量都占有一定大小的内存. 类型的大小一般用字节来衡量.C语言特别提供了一个关键字sizeof来得到类型所占的字节数.其语法形式为

sizeof(类型名或者变量名)

课堂练习四,自己写一个程序,用sizeof运算符输出下面各类型名所占的内存大小,并与上表对照.

char

unsigned char

signed char

int

long

short

signed int

unsigned int

double

long double

 

计算机中最小的存储单元是位.每个位只有两个状态01.一个字节有8,所以一个字节可以存储的状态有128.

16位的编译器如tc,int类型占2个字节,int可以存储的数字有216=65536.而在32位的编译器如vc,sizeof(int) =4.

可以存储的数字有232

如果想在tc中使用32位的整数,可以在int前加long关键字,如下所示

long int x;  /*定义一个长整型的变量x*/

如果只想在tc中使用16位的,可以用short关键字

如下所示

short int x; /*定义一个短整型的变量x*/

c语言的标准规定

sizeof(short int)<=sizeof(int)<=sizeof(long int)

且默认的就是short.

即语句int x; 和语句short int x; 等价.

1.1.5          有符号和无符号数

对于一个字节的char类型, 如果都用来存储正数,就是0-255.如果还想保存负数.就是-128127.(为什么不是-127到正128,以后会讲).

当基本类型名int或者char前有unsigned关键字,表示该类型的变量是无符号的,即肯定是正的.如果是signed,则表示有符号数,可以为负.默认情况下是signed.

一个完整的int变量的声明格式为

signed/unsigned long/short int 变量名;

因此我们前面所写的整型变量声明语句int x;实际上是

unsigned short int x;的缩写.

注意写出long或者short以后,int 类型名可以省略.因此下面的语句都是合法的

long x;  /*可以,相当于signed long int x*/

short x; /*可以,相当于signed short int x*/

unsigned short x; /*可以,相当于unsigned short int x*/

unsigned long x; /*可以,相当于unsigned long int x*/

 

long/short/signed/unsigned的主要作用确定变量值的准确范围.下表列出了tc中各种基本类型的取值范围.注意这个表的内容随编译器和操作系统的不同而发生变化.

类型名

所占字节

取值范围

char(signed char)

1

[-128,127]

unsigned char

1

[0,255]

int (signed short int)

2

[-32768, 32767]

unsigned short int

2

[0,65536]

long int (signed long int)

4

[-2147483648, 2147483647]

unsigned long int

4

[0, 4294967295]

float

4

+[3.4e-38, 3.4e+38]

double

8

+ [1.7e-308, 1.7e+308]

long double

10

+ [3.4e-4932, 1.1e+4932]

每个编译所提供的数据类型的准确范围在标准头文件<limits.h><float.h>

课堂练习二

阅读tc安装目录下的include/limits.hinclude/float.h文件,将里面定义的常数与上表对照.

课堂练习三,下列哪些赋值语句会引起tc的编译警告?

char c= 255;

unsigned char = -2;

char c = 128;

char c = 26;

int x = 70000;

int x = 300*20;

unsigned int x = 400*30;

long x = 7000;

short x = 70000

分享到:

上一篇:1.1 数字的转换和存储——第六课

下一篇:第一课——第七课 复习(自己整理)