数据类型
作用:编译器预算对象(变量)分配的内存大小
Snip20190214_4.png
变量
在程序运行过程中,其值可以改变
变量在使用前必须先定义,定义变量前必须有相应的数据类型
标识符不能是关键字
标识符只能由字母、数字、下划线组成
第一个字符必须为字母或下划线
字母区分大小写
在编译时为其分配相应的内存空间
可以通过其名字和地址访问相应内存
extern声明变量的时候内存中不会创建存储空间,只表示声明,并没有定义
当变量没有进行声明,直接定义变量时,如:int b;它既是声明也是定义,此时内存中会开辟存储空间
进制
概念:逢X进一位就是X进制
二进制
计算机中采用的进制,逢二进一,数据在计算机中主要是以补码的形式存储的
单位:
术语
含义
bit(比特)
一个二进制代表一位,一个位只能表示0或1两种状态。数据传输是习惯以“位”(bit)为单位。
Byte(字节)
一个字节为8个二进制,称为8位,计算机中存储的最小单位是字节。数据存储是习惯以“字节”(Byte)为单位。
WORD(双字节)
2个字节,16位
DWORD
两个WORD,4个字节,32位
1b
1bit,1位
1B
1Byte,1字节,8位
1k,1K
1024
1M(1兆)
1024k, 1024*1024
1G
1024M
1T
1024G
1Kb(千位)
1024bit,1024位
1KB(千字节)
1024Byte,1024字节
1Mb(兆位)
1024Kb = 1024 * 1024bit
1MB(兆字节)
1024KB = 1024 * 1024Byte
八进制
缩写为OCT或O,逢八进一,八进制的数和二进制数可以按位对应(八进制一位对应二进制三位,取三合一),表示八进制时以数字0开头
Snip20190214_7.png
十六进制
由0-9,A-F组成,字母不区分大小写。与10进制的对应关系是:0-9对应0-9,A-F对应10-15,十六进制的数和二进制数可以按位对应(十六进制一位对应二进制四位,取四合一),表示十六进制时以0x开头
Snip20190214_10.png
进制间转换
十进制整数转二进制:十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
eg:
Snip20190214_5.png
十进制小数转二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果
注意点:
乘的时候只乘小数部分
如十进制为3为小数,则二进制也为3为即可
eg:
Snip20190214_13.png
十进制转八进制:十进制数除以8,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
eg:
Snip20190214_8.png
十进制转十六进制:十进制数除以16,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果
eg:
Snip20190214_12.png
内存数值存储方式
在计算机系统中,数值一律用补码来存储
原因如下:
统一了零的编码
将符号位和其它位统一处理
将减法运算转变为加法运算
原码
概念:原始的二进制码
最高位做为符号位,0表示正,为1表示负
其它数值部分就是数值本身绝对值的二进制数
eg:
十进制数
原码
+14
0000 1110
-14
1000 1110
+0
0000 0000
-0
1000 0000
反码
特点:
对于正数,反码与原码相同
对于负数,符号位不变(即最高位不变),其它部分取反(1变0,0变1)
eg:
十进制数
反码
+14
0000 1110
-14
1111 0001
+0
0000 0000
-0
1111 1111
补码
计算机系统中,数值一律用补码来存储
特点:
对于正数,原码、反码、补码相同
对于负数,其补码为它的反码加1
补码符号位不动,其他位求反,最后整个数加1,得到原码
十进制数
补码
+14
0000 1110
-14
1111 0010
+0
0000 0000
-0
0000 0000
整型:int
输出
打印格式
含义
%d
输出一个有符号的10进制int类型
%o(字母o)
输出8进制的int类型
%x
输出16进制的int类型,字母以小写输出
%X
输出16进制的int类型,字母以大写写输出
%u
输出一个10进制的无符号数
void test1(){
int a = 123; //定义变量a,以10进制方式赋值为123
int b = 0567; //定义变量b,以8进制方式赋值为0567
int c = 0xabc; //定义变量c,以16进制方式赋值为0xabc
printf("int整型所占的字节数:%d\n", sizeof(int)); //4个字节,一个字节占8位,即共能放32位
printf("a = %d\n", a);
printf("8进制:b = %o\n", b);
printf("10进制:b = %d\n", b);
printf("16进制:c = %x\n", c);
printf("16进制:c = %X\n", c);
printf("10进制:c = %d\n", c);
unsigned int d = 0xffffffff; //定义无符号int变量d,以16进制方式赋值
printf("有符号方式打印:d = %d\n", d);
printf("无符号方式打印:d = %u\n", d);
}
其余类型
数据类型
占用空间
short(短整型)
2字节
int(整型)
4字节
long(长整形)
Windows为4字节,Linux为4字节(32位),8字节(64位)
long long(长长整形)
8字节
void test2(){
//环境:Mac64位电脑
printf("int整型所占的字节数:%d\n", sizeof(int)); //4个字节,一个字节占8位,即共能放32位
printf("short所占的字节数:%d\n", sizeof(short)); //2个字节,一个字节占8位,即共能放16位
printf("long所占的字节数:%d\n", sizeof(long)); //8个字节,一个字节占8位,即共能放64位
printf("long long所占的字节数:%d\n", sizeof(long long)); //8个字节,一个字节占8位,即共能放64位
}
整型常量
所需类型
10
代表int类型
10l, 10L
代表long类型
10ll, 10LL
代表long long类型
10u, 10U
代表unsigned int类型
10ul, 10UL
代表unsigned long类型
10ull, 10ULL
代表unsigned long long类型
打印格式
含义
%hd
输出short类型
%d
输出int类型
%l
输出long类型
%ll
输出long long类型
%hu
输出unsigned short类型
%u
输出unsigned int类型
%lu
输出unsigned long类型
%llu
输出unsigned long long类型
有符号数
最高位为符号位,0代表正数,1代表负数
无符号数
最高位不是符号位,而就是数的一部分,无符号数不可能是负数
数据类型
占用空间
取值范围
short
2字节
-32768 到 32767 (-215 ~ 215-1)
int
4字节
-2147483648 到 2147483647 (-231 ~ 231-1)
long
4字节
-2147483648 到 2147483647 (-231 ~ 231-1)
unsigned short
2字节
0 到 65535 (0 ~ 216-1)
unsigned int
4字节
0 到 4294967295 (0 ~ 232-1)
unsigned long
4字节
0 到 4294967295 (0 ~ 232-1)
字符型:char
概念
用一对英文半角格式的单引号(' ')把字符括起来,本质就是一个1字节大小的整型
void test3(){
char ch = 'a';
printf("sizeof(ch) = %u\n", sizeof(ch));// 1
printf("ch = %c\n", ch); //打印字符 ‘a’ ASCII的值
printf("ch = %d\n", ch); //打印97
char A = 'A';
char a = 'a';
printf("a = %d\n", a); //97
printf("A = %d\n", A); //65
printf("A = %c\n", 'a' - 32); //小写a转大写A
printf("a = %c\n", 'A' + 32); //大写A转小写a
ch = ' ';
printf("空字符:%d\n", ch); //空字符ASCII的值为32
printf("A = %c\n", 'a' - ' '); //小写a转大写A
printf("a = %c\n", 'A' + ' '); //大写A转小写a
}
ASCII对照表
ASCII****值
控制字符
ASCII****值
字符
ASCII****值
字符
ASCII****值
字符
0
NUT
32
(space)
64
@
96
、
1
SOH
33
!
65
A
97
a
2
STX
34
"
66
B
98
b
3
ETX
35
#
67
C
99
c
4
EOT
36
$
68
D
100
d
5
ENQ
37
%
69
E
101
e
6
ACK
38
&
70
F
102
f
7
BEL
39
,
71
G
103
g
8
BS
40
(
72
H
104
h
9
HT
41
)
73
I
105
i
10
LF
42
*
74
J
106
j
11
VT
43
+
75
K
107
k
12
FF
44
,
76
L
108
l
13
CR
45
-
77
M
109
m
14
SO
46
.
78
N
110
n
15
SI
47
/
79
O
111
o
16
DLE
48
0
80
P
112
p
17
DCI
49
1
81
Q
113
q
18
DC2
50
2
82
R
114
r
19
DC3
51
3
83
S
115
s
20
DC4
52
4
84
T
116
t
21
NAK
53
5
85
U
117
u
22
SYN
54
6
86
V
118
v
23
TB
55
7
87
W
119
w
24
CAN
56
8
88
X
120
x
25
EM
57
9
89
Y
121
y
26
SUB
58
:
90
Z
122
z
27
ESC
59
;
91
[
123
{
28
FS
60
<
92
/
124
|
29
GS
61
=
93
]
125
}
30
RS
62
>
94
^
126
`
31
US
63
?
95
_
127
DEL
转义字符
转义字符
含义
ASCII****码值(十进制)
\a
警报
007
\b
退格(BS) ,将当前位置移到前一列
008
\f
换页(FF),将当前位置移到下页开头
012
\n
换行(LF) ,将当前位置移到下一行开头
010
\r
回车(CR) ,将当前位置移到本行开头
013
\t
水平制表(HT) (跳到下一个TAB位置)
009
\v
垂直制表(VT)
011
\
代表一个反斜线字符""
092
'
代表一个单引号(撇号)字符
039
"
代表一个双引号字符
034
?
代表一个问号
063
\0
数字0
000
\ddd
8进制转义字符,d范围0~7
3位8进制
\xhh
16进制转义字符,h范围09,af,A~F
3位16进制
浮点型:float、double
数据类型
占用空间
有效数字范围
float
4字节
7位有效数字
double
8字节
15~16位有效数字
类型限定符
限定符
含义
extern
声明一个变量,extern声明的变量没有建立存储空间。 extern int a;
const
定义一个常量,常量的值不能修改。 const int a = 10;
volatile
防止编译器优化代码
register
定义寄存器变量,提高效率。register是建议型的指令,而不是命令型的指令,如果CPU有空闲寄存器,那么register就生效,如果没有空闲寄存器,那么register无效。
字符串格式化输出和输入
打印格式
对应数据类型
含义
%d
int
接受整数值并将它表示为有符号的十进制整数
%hd
short int
短整数
%hu
unsigned short
无符号短整数
%o
unsigned int
无符号8进制整数
%u
unsigned int
无符号10进制整数
%x,%X
unsigned int
无符号16进制整数,x对应的是abcdef,X对应的是ABCDEF
%f
float
单精度浮点数
%lf
double
双精度浮点数
%e,%E
double
科学计数法表示的数,此处"e"的大小写代表在输出时用的"e"的大小写
%c
char
字符型。可以把输入的数字按照ASCII码相应转换为对应的字符
%s
char *
字符串。输出字符串中的字符直至字符串中的空字符(字符串以'\0‘结尾,这个'\0'即空字符)
%p
void *
以16进制形式输出指针
%%
%
输出一个百分号