#C语言#6.1 数据类型 笔记


变量


·C语⾔的变量必须:在使⽤前定义,并且确定类型,但是对于类型安全的检查并没有那么严格
语言的发展:C++/JAVA (底层语言)对检查更加严格
JavaScript、Python、PHP(应用语言)不看重类型不需要事先定义
支持观点:有利于发现简单的错误
反对观点:强调类型迫使程序员面对底层、实现而非事务逻辑

·C语言的类型

整数• char、short、int、long、long long
浮点数• float、double、long double
逻辑 •bool
指针
自定义类型

1.类型有何不同
类型名称:int、long、double
输⼊输出时的格式化:%d、%ld、%lf
所表达的数的范围:char < short < int < float < double
内存中所占据的⼤⼩:1个字节到16个字节
内存中的表达形式:⼆进制数(补码)、编码(编码和补码是不同的有时候不能直接做运算)

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

静态的运算符号,直接决定结果的类型,它的结果在编译时刻就决定了
不要在sizeof的括号⾥做运算,这些运算不会做的

** 3.观察类型大小**
32位的编译器和64位的编译器是不一样的


·整数


• char:1字节(8⽐特)
• short:2字节
• int:取决于编译器(CPU),通常的意义是“1个字”
• long:取决于编译器(CPU),通常的意义是“1个字”
• long long:8字节**

(·字长——每一个寄存器(Reg)一次可以处理的数据/总线上一次可以运输的数据就是字长)

1.整数的内部表达(二进制的)
重点:我们以什么类型来看待过

2.表达负数(补码)
巧妙运用看不见的思路

补码:(数字只有8位,所以进位到9位最前面的一位就要被丢掉)
11111111 + 00000001 —> 100000000(最前面的那个1要被舍掉)
00000000 - 00000001 —> 11111111 (补码)

11111111被当作纯⼆进制看待时,是255,被当作补码看待时是-1
补码的意义就是拿补码和原码可以加出⼀个溢出的“零”(加法的时候不用变号)

3.一堆话总结整数表达
• 对于⼀个字节(8位),可以表达的是:
• 00000000 - 11111111
• 其中00000000 —> 0 11111111 ~ 10000000 —> -1 ~ -128(纯二进制和补码都回有区别) 00000001 ~ 01111111 —> 1 ~ 127
计算机中储存的是纯二进制,但是你要怎么看待(纯二进制?Or 补码?)

·整数的范围

• char:1字节:-128 ~ 127
• short:2字节:-32768 ~ 32767
• int:取决于编译器(CPU),通常的意义是“1个字” ()相减就是256
• long:4字节
• long long:8字节

·想要当成纯二进制看待——unsigned
在整形类型前加上unsigned使得它们成为⽆符号的整数,内部的⼆进制表达没变,变的是如何看待它们
Unsigneded在正数部分会被扩大
如何输出——eg:11111111
对于char,是-1,对于unsigned char,是255
00000000~11111111(0-255 ?or -128~127)

·表达成unsigned的方法
如果⼀个字⾯量常数想要表达⾃⼰是unsigned,可以在后⾯
(1)加u或U 255U
(2)⽤l或L表⽰long(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

·8进制和16进制
⼀个以0开始的数字字⾯量是8进制;⼀个以0x开始的数字字⾯量是16进制
%o⽤于8进制,%x⽤于16进制

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

·如何选择整数类型(没有特别的需要就用int)
• 为什么整数要有那么多种?为了准确表达内存,做底层程序的需要(和硬件相关联)
• 没有特殊需要,就选择int


·浮点类型·


#C语言#6.1 数据类型 笔记

·含义·

靠近0的那些极小的数字不能表达
±inf正负无穷大
nan不是一个有效数字
【检验方法——除以0】

·浮点的输入输出·
#C语言#6.1 数据类型 笔记

1.

EG:
ff=1234.56789
%e——1.23456e+03***【%e——输出的是科学计数的法】***
%f——1234.567890
%.16f——百分号后面输出16位小数【输出精度:在%和f之间加上**.n**可以指定输出⼩数点后⼏位,这样的输出是做4舍5⼊的】

浮点是可以表示无穷大,但是整数不能表示无穷大。
#C语言#6.1 数据类型 笔记
2.浮点运算的精度
计算钱的时候不要用浮点数 因为后面的误差会有误差累计

3.浮点数的内部表达【不是二进制数字 是编码数字】
#C语言#6.1 数据类型 笔记
1bit表达±符号
11bit表达指数大小
52bit 表达分数部分
【浮点数在计算时是由专⽤的硬件部件实现的】
【计算double和float所⽤的部件是⼀样的】

4.选择浮点类型
•如果没有特殊需要,使⽤double
【现代CPU能直接对double做硬件运算,性能不会⽐float差,在64位的机器上,数据存储的速度也不⽐float慢】


字符类型


1.char是⼀种整数,也是字符。
• ⽤单引号表⽰的字符字⾯量:‘a’, ‘1’
•'xxxxxx’也是⼀个字符
printf和scanf⾥⽤%c来输⼊输出字符
大概可以理解为——字符有两重身份,一面是整数,一面是字符,就跟学号和名字的感觉。
#C语言#6.1 数据类型 笔记

·把字符输出成计算机中指代的数字。
Printf(“d=%d\n”,d);
输出字符:
Printf(“‘%c’/n”,c);

如果读入的是有何不同?
• scanf("%d %c", &i, &c);
• scanf("%d%c", &i, &c);——只读到整数为止 后面是啥就读啥

2.利用字符二面性作⼤⼩写转换
• 字⺟在ASCII表中是顺序排列的
• ⼤写字⺟和⼩写字⺟是分开排列的,并不在⼀起
‘a’-‘A’可以得到两段之间的距离,于是a+’a’-‘A”可以把⼀个⼤写字⺟变成⼩写字⺟,⽽a+’A’-‘a’可以把⼀个⼩写字⺟变成⼤写字⺟

*3.逃逸字符——*
*原来的字符在语句本身是有意义的(不能当作字符执行),要他在语句中变成一个字符,需要在前面加上一个*

⽤来表达⽆法印出来的控制字符或特殊字符,它由⼀个反斜杠“\”开头,后⾯跟上另⼀个字符,这两个字符合起来,组成了⼀个字符
\b----回去但是不删除
#C语言#6.1 数据类型 笔记


·类型转换


1.⾃动类型转换
• 当运算符的两边出现不⼀致的类型时,会⾃动转换成较⼤的类型
• char —> short —> int —> long —> long long
• int —> float —> double
特别——printf
对于printf,任何⼩于int的类型会被转换成int;float会被转换成double;但是scanf不会,要输⼊short,需要%hd

2.强制转换——大的范围往小的范围转
(类型)值
强制类型转换的优先级⾼于四则运算