数据的类型与表示
一、信息的存储单位
位(bit):度量数据的最小单位,表示1位二进制信息;
字节(Byte):一个字节由8位二进制数据组成;字节是信息存储中最常用的基本单位,计算机的存储器(包括内存与外存)通常也是以多少字节来表示它的容量;
1Byte=8bit
1K=1024B
1M=1024K
1G=1024M
字(Word):字是位的组合,作为一个独立的信息单位处理;字又称为计算机字,它的含义取决于机器的类型、字长以及使用者的要求;常用的固定字长有8位、16位、32位等;
机器字长:一般指参加运算的存储器所含有的二进制数的位数,代表了机器的精度,如32位、64位等;
二、数据类型
1、字符类型--char
共包含256个不同的数值,每个数值可以用来代表一个字符(如'a'、'+'、'Z'、'#'等);ASCII码表记录所有字符数值两个身份之间的对应关系:
0--48、A--65、a--97
2、无符号字符类型--unsigned char
'\n'--换行
'\r'--回车符(把打印位置调整到行开头)
'\t'--制表符(多行打印时所需对齐的内容上下对齐)
'\\'--表示\
'\"'--表示"
'\''--表示'
3、短整数类型--short
包含65536个不同的整数,范围从-32768到32767
4、无符号短整数--unsigned short
范围从0~65535
5、长整数类型--long/long int
包含232个不同的整数,范围从-231~231-1
6、无符号长整数--unsigned long/unsigned long int
范围从0~232-1
7、整数类型--int
8、无符号整数--unsigned int
9、浮点类型--float/double
单精度浮点类型(float)能记录的小数点后的数位较少,双精度浮点类型(double)能记录的小数点后的位数较多;
10、布尔值--bool
0--false 1--true
11、不同数据类型所包含的字节数不同:
char(unsigned char) --一个字节
short(unsigned short) --两个字节
int(unsigned int) --四个字节
long(unsigned long) --四个字节
float --四个字节
double --八个字节
三、数据类型和占位符的对应关系
每个占位符必须有一个数值和它对应,数值按照从前向后的顺序依次替换所有的占位符:
printf("%d+%d=%d\n",num01,num02,num03);
char %c和%hhd
unsigned char %c和%hhu (%c对应字符身份,%hhd和%hhu对应数字身份)
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不会保留)
字符串 %s
%nd--可作为占位符打印整数,其中n为一个数字,该占位符要求打印结果在屏幕上一定占有n个位置;
%-nd--作占位符要求有效数字出现在n个位置的左边;
%0nd--作占位符打印时空出来的位置填字符0;
%n.mf--作占位符可以打印浮点数据,整个打印结果一共占n个位置,其中小数点后面的部分占m个位置;
%x/%X--将一个整数的十六进制表示形式打印在屏幕上;%x打印的字母是小写的,%X打印的字母是大写的;
四、进位计数之间的转换
1、二进制<-->十进制
二进制转换为十进制:
把二进制表示方式中的所有的1对应的数字找出来,然后求和就得到所对应的十进制表示方式
(0110 1010)2-->21+23+25+26=(106)10
(111.11)2-->22+21+20+2-1+2-2=(7.75)10
十进制转换为二进制:
将十进制数字不断地进行除2取余的操作直至为0止,然后将操作所得的余数由下至上依次从左(高位)向右(低位)写下来,最后不是8位数位的用0补齐,即为对应的二进制
(91)10=(0101 1011)2
(68)10=(0100 0100)2
十进制小数转换为二进制小数:
将十进制的小数连续地乘2,得到的整数部分即组成二进制小数
(0.3125)10=(0.0101)2
0.3125 x 2 = 0.625
0.625 x 2 = 1.25
0.25 x 2 = 0.5
0.5 x 2 = 1.0
(68.3125)10=(1000100.0101)2
分别进行整数部分和小数部分的转换,然后再拼在一起
2、八进制<-->十进制
八进制转换为十进制:
(3506.2)8=3x83+5x82+0x81+6x80+2x8-1=(1862.25)10
十进制转换为八进制:
除8取余
(168)10=(250)8
3、十六进制<-->十进制
十六进制转换为十进制:
(0.2A)16=2x16-1+10x16-2=(0.1640625)10
十进制转换为十六进制:
除16取余
(168)10=(A8)16
4、二、八、十六进制的相互转换
(01101101)2=001 101 101=20 22+20 22+20=(155)8
(1000100)2=0100 0100=22 22=(44)16=0x44
(1011010.10)2=001 011 010 . 100=20 21+20 21 . 22=(132.4)8
(1011010.10)2=0101 1010 . 1000=22+20 23+21 . 23=(5A.8)16
(F)16=(15)10=(1111)2
(F7)16=(1111 0111)2
五、二进制的编码表示
1、原码
X=+0101011 -- [X]原=00101011
X=-0101011 -- [X]原=10101011
X=0.1011 -- [X]原=0.1011
X=-0.1011 -- [X]原=1.1011
2、反码
正数的反码与原码表示相同;负数反码的符号位与原码相同,其余各位取反;
X=+1100110 -- [X]原=01100110 -- [X]反=01100110
X=-1100110 -- [X]原=11100110 -- [X]反=10011001
X=0.1011 -- [X]原=0.1011 -- [X]反=0.1011
X=-0.1011 -- [X]原=1.1011 -- [X]反=1.0100
3、补码
正数的原码、反码、补码形式相同;负数的补码由该数的反码的最末位加1求得;
求X=-1010101的补码:
[X]原=11010101 -- [X]反=10101010 -- [X]补=10101011
求X=-0.1011的补码:
[X]原=1.1011 -- [X]反=1.0100 -- [X]补=1.0101
注意:二进制在进行+1操作时,须遵循以下方法:
①当二进制的最右边数位为0时,直接将该数位改为1,即完成+1操作;
②当二进制的最右边数位为1时,将二进制从右向左的连续多个1改成0,将遇到的第一个0变成1;