数据类型 scanf标准函数 sizeof关键字 二进制(day03)

字符类型的名称是char
字符类型里包含256个不同的整数,每个
    整数对应一个字符(例如'a', '^'等)
这些整数和字符完全可以互相替代
ASCII码表列出所有整数和字符的对应关系
'a'           97
'A'           65
'0'           48

ASCII码表里所有小写英文字母是连续排列的,
    其中'a'对应的整数最小,'z'对应的整数
    最大
所有大写英文字母和阿拉伯数字字符也都符合
   这个规律

'd' - 'a'   等于  'D' - 'A'
'd' - 'a'   等于  '3' - '0'   等于  3 - 0

所有字符数据被分成两组,每组包含128个
其中一组字符对应的整数在所有计算机上都
    一样,这些整数的范围从0到127
另外一组字符对应的整数在不同计算机上有可能
    不同,这些整数的范围可能从-128到-1也
    可能从128到255

'\n'        换行字符
'\r'        回车字符
'\\'        代表字符\
'\''        代表字符'
'\"'        代表字符"

短整数类型名称是short
它里面包含65536个不同的整数,其中一半是
    负数,另外一半是非负数。这些数字以0
    为中心向两边扩展。

长整数类型名称是long
它里面包含2的32次方个不同的整数,其中
    一半是负数,另外一半是非负数。这些
    数字以0为中心向两边扩展。

整数类型名称是int
在我们的计算机里整数类型和长整数类型
   完全一样

以上类型都叫做有符号类型
每个有符号类型都有一个对应的无符号类型,
   无符号类型的名称就是在对应有符号类型
   名称前加unsigned(例如unsigned char,
    unsigned int等)
无符号类型包含的数字个数和对应的有符号
   类型一样,但是不包含负数

整数相关类型所包含的数字范围互相重叠并
   逐渐扩大

程序中不带小数点的数字后加u表示这个数字
   的类型是无符号整数类型

C语言里用浮点类型表示带小数点的数字
浮点类型分为单精度浮点类型和双精度浮点类型
双精度浮点类型可以记录更多小数点后面的数位
单精度浮点类型的名称是float
双精度浮点类型的名称是double

程序中带小数点的数字默认都是双精度浮点
   类型的
如果在带小数点的数字后加f就表示这个数字的
   类型是单精度浮点类型

C语言里可以创建新的数据类型
这些新的数据类型叫做复合数据类型
复合数据类型必须先创建出来然后才能使用

C99规范里引入布尔类型
布尔类型里只包含两个数字,一个叫真另外
   一个叫假。真用1表示,假用0表示。
真和假都叫做布尔值

所有整数都可以当作布尔值使用,0当作布尔值
    使用的时候是假,其他所有整数当布尔值
    使用的时候都是真

一般在程序里不需要使用布尔类型,直接用
   整数类型代替

数据类型和占位符的对应关系
char和unsigned char          %c
short                        %hd
unsigned short               %hu
long                         %ld
unsigned long                %lu
int                          %d
unsigned int                 %u
float                        %f或%g
double                       %lf或%lg
                  %f或%lf会保留小数点后
                  无效的0,%g和%lg不会保留

不同类型存储区所包含的字节个数可能不同
sizeof关键字可以用来计算一个类型的存储区
    所包含的字节个数

char和unsigned char        1个字节
short和unsigned short      2个字节
int和unsigned int          4个字节
long和unsigned long        4个字节
float                      4个字节
double                     8个字节

sizeof关键字小括号里可以写任何能当作
    数字使用的内容
sizeof小括号里对任何存储区内容的修改不会
    真正发生

scanf标准函数可以用来从键盘得到用户临时
   输入的数字
为了使用这个标准函数需要包含stdio.h头文件
scanf函数调用语句里要使用存储区的地址
   表示存储区
双引号里使用占位符表示存储区的类型
不要在scanf函数调用语句的双引号里写不是
    占位符的内容
如果用户输入的内容不符合程序中要求的格式
    程序就不能得到数字
可以在一条scanf函数调用语句里得到多个数字,
    这个时候要提供多个存储区地址

一个字节分成八段,每段只能记录一个0或者1
要想把一个数字记录到一个字节里就需要首先
    把这个数字拆分成八个0或者1
用一组0或者1表示数字的方法叫做二进制
任何一个数字既可以用十进制方式表示也可以
    用二进制方式表示
计算机里只能记录二进制方式表示的数字
二进制表示方式里包含很多数位,每个数位
    有一个编号。最右边数位的编号是0,向左
    依次递增。
某个数位里的1代表的数字是2的数位编号次方
二进制表示方式中如果两个相邻数位的内容一样
    则左边数位代表的数字是右边数位代表
    数字的2倍
二进制表示的非负数符合以上规则
二进制数字加一的时候需要把编号0位置开始的
    连续多个1都变成0,把最右边的0变成1

二进制表示的非负数转换成十进制的时候首先
   把每个数位单独代表的数字计算出来然后再
   求和

0001 0011 = 2的4次方 + 2的1次方 + 2的0次方
          = 16 + 2 + 1
          = 19

0110 1010 = 2的6次方 +2的5次方 + 2的3次方
               + 2的1次方
          = 64 + 32 + 8 + 2
          = 106

不断对原始数字进行除以2并保留整数部分的
   操作可以得到一组数字,用这组数字中的
   每一个除以2取余得到一个数位的内容。
   把所有数位按照从后向前的顺序书写就
   得到转换结果。

12          *******0
 6          ******0
 3          *****1
 1          ****1
 0          ****

转换结果是0000 1100

91         1
45         1
22         0
11         1
 5         1
 2         0
 1         1
 0         0

 转换结果是0101 1011

负数的二进制和十进制之间不能直接转换,
   必须借助相反数

转换过程需要首先计算相反数,然后把相反数
    进行转换,最后根据转换结果再计算相反数

把二进制数字中每个数位的内容变成相反数然后
    再加一就得到相反数的二进制

-14
14
0000 1110
1111 0001 + 1 = 1111 0010

有符号类型数字最左边的二进制数位内容可以
   用来判断数字的符号,这个数位叫做符号位。
   符号位内容是0表示数字是非负数,符号位
   内容是1表示数字是负数。

1100 0101
0011 1010 + 1 = 0011 1011
59
-59

 

posted @ 2017-10-26 08:56  Kernel001  阅读(581)  评论(0编辑  收藏  举报