数据类型


1. C是有类型的语?

C语?的变量,必须:

在使?前定义,并且

确定类型

C以后的语?向两个?向发展:

C++/Java更强调类型,对类型的检查更严格

JavaScript、Python、PHP不看重类型,甚?不需 要事先定义

2.类型安全

?持强类型的观点认为明确的类型有助于尽早发现程 序中的简单错误

 反对强类型的观点认为过于强调类型迫使程序员?对 底层、实现??事务逻辑

总的来说,早期语?强调类型,?向底层的语?强调 类型 ? C语?需要类型,但是对类型的安全检查并不?够

3. C语?的类型

4. 类型有何不同

类型名称:int、long、double

输?输出时的格式化:%d、%ld、%lf

所表达的数的范围:char < short < int < float < double

内存中所占据的??:1个字节到16个字节

内存中的表达形式:?进制数(补码)、编码

5. sizeof

是?个运算符,给出某个类型或变量在内存中所占据 的字节数

? sizeof(int)

? sizeof(i)

6. sizeof

是静态运算符,它的结果在编译时刻就决定了

不要在sizeof的括号?做运算,这些运算不会做的

7. 整数

char

short

int

long

long long

8.整数

char:1字节(8?特)

short:2字节

int:取决于编译器(CPU),通常的意义是“1个字”

long:取决于编译器(CPU),通常的意义是“1个字”

long long:8字节

9. *整数的内部表达

计算机内部?切都是?进制

? 18 —> 00010010

? 0 —> 00000000

? -18 —> ?

10. *如何表?负数

?进制?“-”来表?负数,在做计算的时候

? 加减是做相反的运算

? 乘除时当作正数,计算完毕后对结果的符号取反

11. *?进制负数

1个字节可以表达的数:

00000000 — 11111111 (0-255)

? 三种?案:

1. 仿照?进制,有?个特殊的标志表?负数

2. 取中间的数为0,如1000000表?0,?它?的是 负数,?它?的是正数

3. 补码

12. *补码

考虑-1,我们希望-1 + 1 —> 0。如何能做到?

  • 0 —> 00000000
  1.  1 —> 00000001
  2. 11111111 + 00000001 —> 100000000
  •  因为0 - 1 —> -1,所以,-1 =
  1.  (1)00000000 - 00000001 —> 11111111
  2. 11111111被当作纯?进制看待时,是255,被当作补码看待时是 -1
  3.  同理,对于-a,其补码就是0-a,实际是2n - a,n是这种类型的位数

13. 数的范围

  • 对于?个字节(8位),可以表达的是:
  1. 00000000 - 11111111
  •  其中
  1. 00000000 —> 0
  2. 11111111 ~ 10000000 —> -1 ~ -128
  3. 00000001 ~ 01111111 —> 1 ~ 127

14. 整数的范围

char:1字节:-128 ~ 127

short:2字节:-32768 ~ 32767

 int:取决于编译器(CPU),通常的意义是“1个字”

long:4字节

long long:8字节

15. unsigned

  • 在整形类型前加上unsigned使得它们成为?符号的整 数
  • 内部的?进制表达没变,变的是如何看待它们
  1. 如何输出
  • 11111111
  1. 对于char,是-1
  2. 对于unsigned char,是255

16. unsigned

如果?个字?量常数想要表达??是unsigned,可以 在后?加u或U

255U

?l或L表?long(long)

*unsigned的初衷并?扩展数能表达的范围,?是为 了做纯?进制运算,主要是为了移位

17. 整数越界

整数是以纯?进制?式进?计算的,所以:

  • 11111111 + 1 —> 100000000 —> 0
  •  01111111 + 1 —> 10000000 —> -128
  •  10000000 - 1 —> 01111111 —> 127

18. 整数的输?输出

只有两种形式:int或long long

%d:int

%u:unsigned

%ld:long long

%lu:unsigned long long

19. 8进制和16进制

?个以0开始的数字字?量是8进制

?个以0x开始的数字字?量是16进制

%o?于8进制,%x?于16进制

8进制和16进制只是如何把数字表达为字符串,与内 部如何表达数字?关

20. 选择整数类型

  • 为什么整数要有那么多种?
  1. 为了准确表达内存,做底层程序的需要
  • 没有特殊需要,就选择int
  1. 现在的CPU的字?普遍是32位或64位,?次内存读写就是 ?个int,?次计算也是?个int,选择更短的类型不会更 快,甚?可能更慢
  2. *现代的编译器?般会设计内存对?,所以更短的类型实 际在内存中有可能也占据?个int的??(虽然sizeof告诉 你更?)
  •  unsigned与否只是输出的不同,内部计算是?样的

21. 浮点数

22. 浮点的输?输出

23. 科学计数法

24. 输出精度

在%和f之间加上.n可以指定输出?数点后?位,这样 的输出是做4舍5?的

printf("%.3f\n", -0.0049);

printf("%.30f\n", -0.0049);

printf("%.3f\n", -0.00049);

25. 超过范围的浮点数

printf输出inf表?超过范围的浮点数:±∞ 

printf输出nan表?不存在的浮点数

26. 浮点运算的精度

27. *浮点数的内部表达

浮点数在计算时是由专?的硬件部件实现的

计算double和float所?的部件是?样的

28. 选择浮点类型

如果没有特殊需要,只使?double

现代CPU能直接对double做硬件运算,性能不会? float差,在64位的机器上,数据存储的速度也不? float慢

29. 字符类型

char是?种整数,也是?种特殊的类型:字符。这是 因为:

?单引号表?的字符字?量:'a', '1'

''也是?个字符

printf和scanf??%c来输?输出字符

30. 字符的输?输出

如何输?'1'这个字符给char c?

scanf("%c", &c);—>1

scanf("%d", &i); c=i; —>49

'1'的ASCII编码是49,所以当c==49时,它代表'1'

printf("%i %c\n", c,c ); ? ?个49各?表述!

31. 混合输?

有何不同?

? scanf("%d %c", &i, &c);

? scanf("%d%c", &i, &c);

32. 字符计算

?个字符加?个数字得到ASCII码表中那个数之后的 字符

两个字符的减,得到它们在表中的距离

33. ??写转换

字?在ASCII表中是顺序排列的

?写字?和?写字?是分开排列的,并不在?起

‘a’-‘A’可以得到两段之间的距离,于是

a+’a’-‘A”可以把?个?写字?变成?写字?,?

a+’A’-‘a’可以把?个?写字?变成?写字?

34. 逃逸字符

?来表达?法印出来的控制字符或特殊字

35. 回?换?

36. 制表位

每?的固定位置

?个\t使得输出从下?个制表位开始

?\t才能使得上下两?对?

37. 逻辑类型

bool

#include

 之后就可以使?bool和true、false

bool的运算

? 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

? 注意这时候的安全性,?的变量不总能表达?的量

? (short)32768

强制类型转换

JavaScript、Python、PHP不看重类型,甚?不需 要事先定义