使用 Visual Studio 2019 【在更】基础 | C 语言笔记( 三 )


以 float 类型为例 。小数部分 23 位 , 能够表示的有效数字2 23 =2^{23}= 223= , 即最大到 0. 。因此小数部分可表示 1~6 位的所有小数(如 0.)与 7 位小于 0. 的小数 。
由于浮点型变量计算时为二进制指数部分 E 与小数部分 M 相乘(即进行移位) , 则有效数字在 6~7 位之间 , 达到逼近效果 。
例 1:float f = 1. 加 20
输出:
f 仅在赋值存入时即产生精度丢失 。
由于浮点型常量默认按型运算 , 输出时 %f 格式为型 , 占 8 个字节 。具体参考【转】格式串中的%f的输出格式和内容 。
例 2:float f == 1.456?
输出:
单步调试:
f 值精确到小数点后 7 位 , 不等于 1.456 。
正确写法:判断两个浮点数是否相等 , 直接用减法 。
两数相减的绝对值在精度范围内 。
输出:
存在部分浮点数相乘(移位)相等(如 4.5) , 但为保证准确性仍需直接计算 。
例 3: f =1.
输出:
由于型浮点数有效数字为 15~16 位 , 输出结果正确 。
2.6 字符型数据 2.6.1 字符型常量
用单引号括起来的一个字符 。
正确示例:‘a’、‘A’、‘1’、’ ' 。
错误示例:‘abc’、“a”、“” 。
ASCII 表:
ASCII 表的存储与输出:
单个字符:
例:字符 A
输出:
上述程序若赋值 65 则输出不变 。
以带符号整数形式输出为 65 是因为 , 在 ASCII 表中 , 字符 A 对应的十进制数为 65 。
注:ASCII 表中十进制为 0 对应的字符为空字符 , 十进制为 32 对应的字符为空格 。
汉字:
注:汉字为 GBK 编码(其一) , 每个汉字占 2 个字节 。
例:打印 0xCC
输出:
2.6.2 字符数据在内存中的存储形式及其使用方法
字母大小写转换:
大小写字母间的 ASCII 值差 32 。
例:大写字母 ASCII 值 +32
输出:
转义字符:
“\n” 表示光标跳至新建的下一行行首 。“\r” 表示跳至该行行首 。“\b” 光标前退(向左)一个字符 。“\t” 即 Tab 键 , 在黑窗口中输出 4 或 8 个空格(无标准规定) 。“\” 输出每一个 “\” 前都需要加入转义字符 “\” 用于输出 。“\0” 表示结束符 , 即NULL 。使用时写作 ‘\0’ 。“\ddd” 表示转义字符后输入 1~3 位十进制数 , 输出对应八进制数的 ASCII 字符 。“\xhh” 中 “\” 表示之后的 “hh” 从十六进制转换为十进制 , 输出为十进制数的 ASCII 字符 。光标后(右侧)存在字符 , 再输入字符将会覆盖光标后原有字符(功能类似于键盘上的 ) 。
例:
输出:
注:注释中存在未加 " " 符号的 \ 将导致编译错误 。原因未知 \{}{原因未知} 原因未知?
2.7 字符串型常量
例:字符变量赋值
输出:
解析:
查看内存 , c 与 *p 在内存中的状态如下:
显然 , 字符串 “A” 并未被存放至字符型变量 c 的地址上 , 反之被存放的是字符 “0” 。同时 , 顺着 *p 的地址网上爬 , 在
地址找到存入的字符串 “A” 。
查表可知 , 字符 “0” 对应的十进制 ASCII 码为 48 , 转换为计算机的十六进制表示即为 30 。因此 , 当编译器执行 char c = "A"; 时 , 先将字符串 “A” 在内存中任意选择一个位置存入 , 随后将存入地址的最低位存入变量 c 的位置 。
因此不可将字符串直接赋值给字符型变量 , 而应当将其赋值给字符型变量的指针 。