-
C是有类型的语言
C语言的变量,必须在使用前定义,确定类型。
C++和Java更强调类型,对类型的检查更加严格;JavaScript,python,PHP不看重类型,甚至不需要事先定义。
-
类型安全
支持强类型的观点认为明确的类型有助于尽早发现程序中的简单错误。
反对强类型的观点认为过于强调类型迫使程序员面对底层,实现而非shiwu事务逻辑。
所以,早起的语言强调类型,面向底层的语言强调类型。
C语言需要类型,但是对类型的安全检查不足够。
-
C的类型
整数:char、short、int、long、long long
浮点数:float、double、long double
逻辑:bool
指针
自定义类型
上面加粗斜体下划线的是C99的类型。
-
类型的不同
int 、long、 double
输入输出时的格式化:%d、%ld、%lf
所表达的数的范围:char<short<int<float<double
内存中所占据的大小:1个字节到16个字节
内存中的表达形式:二进制数(补码)、编码
-
sizeof
是一个运算符,给出某个类型或变量在内存中所占据的字节数。
sizeof(int)、sizeof(i)
是静态运算符,它的结果在编译时刻就决定了。
不要在sizeof的括号内做运算,这些运算是不会做的。
-
整数
char:1字节(8比特)
short:2字节
int:取决于编译器(CPU),通常的意义是“1个字”
long:取决于编译器(CPU),通常的意义是“1个字”
long long:8字节
-
整数的内部表达
计算机内部一般为二进制
负数用补码来表示。
-
数的范围
对于一个字节(8位),可以表达的是:00000000—11111111
其中,00000000——>0,
11111111~100000000——>-1~-128
00000001~011111111——>1~127
-
整数的范围
char:1字节 -128~127
short:2字节 -32768~32767
int :取决于编译器(CPU),通常的意义是“1字节”
long:4字节
long long:8字节
-
unsigned
在整形的基础上在前面加上unsigned使得它们成为无符号的整数。
内部的二进制表达没变,变的是如何看待它们。
例如:对于11111111,对于char来讲,是-1,对于unsigned char来说,是255.
如果一个字面量常数想要表达的自己是unsigned,可以在后面加u或U,
用l或L表示long
unsigned 的初衷并非扩展数能表达的范围,而是为了做纯二进制运算,主要是为了移位。
-
整数越界
整数是以纯二进制方式进行计算的,
11111111+1——>100000000——>0
01111111+1——>10000000——>-128
10000000-1——>01111111——>127
-
整数的输入输出
只有两种形式:int 或long long
%d:int
%u:unsigned
%ld:long long
%lu:unsigned long long
一个以0开始的数字字面量是8进制
一个以0x开始的数字字面量是16进制
%o用于8进制,%x用于16进制
8进制和16进制只是如何把数字表达为字符串,与内部如何表达数字无关。
16进制很适合表达二进制数据,因为4位二进制正好是一个16进制位。
-
其他
整数那么多种是为了准确表达内存,做底层程序的需要,一般选择int;现代的编译器一般设计为内存对齐,所以更短的类型在实际的内存中有可能也占据一个int的大小(即使sizeof告诉你更小)。
unsigned与否输出的不同而已,内部的计算是一样的。
-
浮点数
科学计数法:-5.67E+16 第一个符号是可选的+或-号,小数点也是可选的,可以用e或E,第二个符号可以是-或+(+可以省略),整个词是不允许有空格的。
输出精度:在%和f之间加上.n可以指定输出小数点后几位,这样的输出是带四舍五入的。
超出范围的浮点数,printf输出inf表示超过范围的浮点数,+-∞
输出nan表示不存在的浮点数。
带小数点的字面量是double而非float,float需要用f或F后缀来表明身份。
f1 == f2这样的赋值可能会失败。需要这样:fab(f1-f2)<1e-12
浮点数的内部表达:
浮点数在计算时是由专用的硬件部件实现的。
计算double和float所用的部件是一样的。
如果没有特殊需要,只使用double
-
字符类型
char是一种整数,也是一种特殊的类型,即用单引号表示的字符字面量‘a’,‘1’
‘’也是一个字符
用%c来输入输出字符。
-
逃逸字符
用来表达无法打印出来的控制字符或特殊字符。
\b :回退一格
\" :双引号
\t :到下一个表格位
\’ :单引号
\n :换行
\\ :反斜杠本身
\r :回车
制表位:是每行的固定位置,一个\t使得输出从下一个制表位开始,用\t才能使得上下两行对齐。
-
逻辑字符
bool:使用#include <stdbool.h>后就可以使用bool和true和false
bool运算实际上是以int的手段实现的,所以可以当做int来计算,也只能当做int来输入输出。
-
类型转换
当运算符两侧出现不一致的类型时,会自动转换成较大的类型,大的意思是能表达的数的范围更大。
char<short<int <long <long long
int <float<double
对于printf,任何小于int的类型会被转换为int,float会被转换为double。
但是scanf不会,要输入short,需要%hd
强制类型转换:要把一个量强制转换成另一个类型,只是从那个变量计算出了一个新的类型的值,它并不改变那个变量,格式:
(类型)值
例如:(int)10.2 、 (short)32
强制类型转换的优先级高于四则运算
如:(int)a/b和(int)(a/b)的区别。
来源自MOOC