数据和C
本文为 《C Primer Plus 第五版》 读书总结
第三章总结
先上示例程序
1 | /*rhodium.c --用金属铑衡量你的体重*/ |
- 此程序包含的新元素
%.2f
精确控制输出到小数点后两位int
整型变量float
浮点变量 (即可使用带小数点的数)scanf()
函数 可为程序提供键盘输入%f
指示scanf()
从键盘上读取一个浮点数&weight
将输入值赋予命为weight的变量中
常量和变量
- 程序需要使用数据,即承载信息的数字或字符
- 数据在整个程序中预先设置好且运行时无变化为常量
- 数据在程序运行时可能变化或被赋值的量为变量
数据类型关键字
如果是常量——直接书写
如果是变量——声明类型
原来的K&R关键字 | C90关键字 | C99关键字 |
---|---|---|
int | signed | _Bool |
long | void | _Complex |
short | _Imaginary | |
unsigned | ||
char | ||
float | ||
double |
解释:
int
关键字提供C的基本整数类型long
short
unsigned
signed
这些为变种char
用于表示字母以及其他字符,也可表示小的整数float
double
和组合long double
表示带有小数点的数_Bool
表示布尔值 (true or false)_Complex
和_Imaginary
分别表示复数和虚数
以上类型按计算机存储方式划分为:
整数(integer)类型
浮点数(floating-Point)类型
位、字节和字
- 最小的存储单位:位 (bit)
- 常用计算机存储单位: 字节(byte)
- 自然的存储单位: 字 (word)
整数类型&浮点数类型
区别:他们的存储方式不同
- 整数 (没有小数部分的数)
- 以二进制位存储
- 浮点数 (包含了整数之间的那些数)
例:2.75 3.16E7 7.00加了小数点的数是浮点型值
- 浮点数存储方式:将一个数分为小数部分和指数部分分别存储
两种类型在应用中的区别
- 整数没小数部分,浮点数有
- 浮点数可表示比整数范围大的多的数
- 对于一些算术运算,使用浮点数会损失更多精度
- 浮点数不能表示区域范围,只是实际值的近似
- 浮点运算通常比整数慢
C 数据类型
有符号类型
分正负的类型
- 有符号类型最高数称为符号位
- 为
1
时 表示该数为负值 - 为
0
时 表示该数为正值
- 为
例:
- 一个字节 0111 1111 最高位
0
表示正号 则
0111 1111 = + 111 1111 = +127 - 一个字节 1111 1111 最高位
1
表示负号 则
1111 1111 = - 111 1111 = -127
无符号类型
无正负的类型
- 其最高位的
1
或0
和其他位一样,用来表示该数的大小
例:
- 一个字节 1111 1111 = 255
∴无符号的一个字节表示的数据范围为:0~255
共256个
int类型
- int类型是基本选择 (系统的基本整数类型)
- C语言保证其至少有16位长
- int类型是
有符号类型
正负都可 取值范围依赖于计算机
声明int变量
1 | int abc; |
分开声明 合并声明均可
初始化变量
- 初始化(initialize)变量就是为变量赋一个初始值
1 | int dogs = 21; |
声明语句为变量创建,标定存储空间并为其制定初始值
打印int值
使用printf()
函数打印%d
为格式说明符(format specifier)用于指示在一行中的什么位置打印整数
注意:格式说明符的数目同待打印数目相同
八进制和十六进制
- 前缀
0x
或0X
表示使用十六进制值 - 前缀
0
表示使用八进制值
显示八进制数和十六进制数
- 八进制显示整数
%o
- 十六进制显示整数
%x
显示C语言前缀
使用格式说明符%#o
%#x
%#X
分别生成0
0x
0X
前缀
1 | // bases.c 以十进制、八进制和十六进制形式输出100 |
输出结果:
1 | 十进制=100;八进制=144;十六进制=64 |
注意:要显示0
和0x
前缀必须在说明符中加入#
符号!
其他整数类型
short int类型 (short类型)
- 可能占用比int类型更少的存储空间,最大的short整数不大于最大的int整数值
- 用于仅需小数值的场合以节省空间
- 有符号类型
- C语言保证其至少有16位长
long int类型 (long类型)
- 可能占用比int类型更多的存储空间,此类型整数不小于最大int整数值
- 用于使用大数值的场合
- 有符号类型
- C语言保证其至少有32位长
long long int类型 (long long类型)
- 可能占用比long类型更多的存储空间,此类型整数不小于最大long整数值
- 用于使用更大数值的场合
- 有符号类型
unsigned int类型
- 用于只使用非负值的场合
- 可表示更大数值
- 无符号类型
关键字signed
可跟任何有符号类型一起使用,它使数据类型更明确
声明其他整数类型
1 | long int abc; |
基本数据类型最小取值范围
16位单位
short
类型和int
类型最小取值范围: -32767~32767
32位单位
long
类型最小取值范围:-2147483647~2147483647
unsigned short类型和unsigned int类型
- 最小取值范围:0~65535
unsigned long类型
- 最小取值范围:0~4294967295
long long类型
- 最小取值范围:-9223372036875775807~9223372036875775807
unsigned long long类型
- 最小取值范围:0~18446744073709551615
诸多整数类型中优先考虑
unsigned
类型、没必要时不要使用long
类型、如需64位整数,使用long long
类型、在int
为32位系统时,如需使用16位的值,使用short
类型可以节省存储空间
整数溢出
1 | //toobig.c --超出您系统上的最大int值 |
输出结果:
1 | 2147483647 -2147483648 -2147483647 |
为什么会这样:无符号整数j当它达到最大值的时候,它将直接溢出到起始值也就是0
,整数i道理相同,但是整数i属于有符号类型,它的起始值是-2147483648
。但注意当i溢出它的最大值时,系统并没有给出提示
打印其他类型数
- 打印
unsigned int
数字:%u
- 打印
long
数值:%ld
若系统的
int
和long
类型具有相同长度,可使用%d
- 十六进制
long
:%lx
- 八进制
long
:%lo
short
类型%hd
十进制%ho
八进制%hx
十六进制
h
和l
前缀可+u
表示无符号类型%lu
unsigned long int%hu
unsigned short int
long long
类型%lld
有符号%llu
无符号
格式说明符只能使用小写字母!
char
类型
char
类型用于存储字母和标点符号之类的字符,但其本身是整数类型
打印字符: %c
可使用:
- unsigned
- signed
声明
1 | char abc; |
若赋值一个字符给变量: 加单引号/写ASCII码
1 | char grade = `A` |
ASCII码和转义字符
计算机处理字符时使用ASCII码,标准ASCII码值范围:0~127
单引号技术适用于字符、数字、标点符号
动作描述使用转义序列或ASCII码
序列 | 意义 |
---|---|
\a |
警报 |
\b |
退格 |
\f |
走纸 |
\n |
换行 |
\r |
回车 |
\t |
水平制表位 |
\v |
垂直制表位 |
\\ |
反斜杠(\) |
\' |
单引号(`) |
\" |
双引号(”) |
\? |
问号(?) |
\Ooo |
八进制值(o表示一个八进制数字) |
\xhh |
十六进制(h表示一个十六进制数字) |
ASCII
码和转义字符之间,优先使用转义字符!它可使程序的可移植性更好!
总结完毕~