char类型
基础信息
-
字符型
-
单位:一个字节(8bit位)
-
格式匹配符:
- 数值型:
- 有符号:%hhd ------char显示数值专用格式匹配符
- 无符号:%hhu -------unsingned char显示数值专用格式匹配符
- 字符型:
- %c
- 数值型:
-
取值范围:
- 有符号:-128 ~127
- 无符号:0~255
-
程序获取:
-
// // Created by Lollipop on 2020/3/24. // #include<stdio.h> #include<limits.h> int main(void){ //获取无符号数取值范围 printf("char 无符号 min = 0, max = %hhu\n",UCHAR_MAX); //获取有符号数值取值范围 printf("char 有符号 min = %hhd, max = %hhd\n",CHAR_MIN,CHAR_MAX); //获取char占用的字节数 printf("char 大小 = %u\n",sizeof(char)); //获取unsigned char 占用的字节数 printf("unsigned char 大小 = %u\n",sizeof(unsigned char)); } 输出: char 无符号 min = 0, max = 255 char 有符号 min = -128, max = 127 char 大小 = 1 unsigned char 大小 = 1
ASCII码
-
char取值范围-128~127每个数字对应一个ASCII字符,具体查看表格
-
0~32 ASCII 对应的字符都不可见
-
常用的ASCII码
- ‘A’ ----65
- ‘a’ ----97
- ’0‘ ----48
- ‘\n’ ----10
- '\t’制表符,tab对应的字符 -----9
- ‘\0’ ------0
-
练习
-
// // Created by Lollipop on 2020/3/24. // 根据ASCII表进行大小写转换 // #include<stdio.h> int main(void){ char ch = 'F'; printf("F 转换的小写字符是%c\n",ch+32); //ch+32 :表达式,对应格式匹配符%c,ascii表中大小写字符相差32,大写的比小写的小32 char zh = 'h'; printf("h 转换的大写字符是%c\n",zh-32); char sh = '5'; //借助字符5,利用ASCII特性,求出字符9 printf("打印字符9 = %c\n",sh+4); }// // Created by Lollipop on 2020/3/24. // #include<stdio.h> int main(void){ //在一个printf函数中,打印输出hello换行world 换行。 printf("hello\nworld \n"); char ch = '\n'; printf("hello%cworld%c",ch,ch); //等价于printf("hello\nworld \n"); printf("hello%dworld%d\n",ch,ch); //%d 匹配\n对应的ascii值 //一个printf中打印'hello(一个tab缩进)workld换行 char zh = '\t'; printf("hello%cworld%c",zh,ch); //等价于printf("hello\tworld\n"); } 输出: hello world hello world hello10world10 hello world Process finished with exit code 0
转义字符
-
实型(浮点型)【了解】
-
显示小数
-
float:单精度。 格式匹配符:%f 大小:4字节 (可以使用sizeof())求取
- 3.14; 默认会被编译器理解为double类型
- float v = 3.14f; 编译器理解为float
- %f格式匹配符,默认保留6位小数
-
double:双精度浮点型。 格式匹配符:%lf 大小:8字节
-
double d = 2.234;
-
int main(void){ printf("float 范围:%f ~ %f\n",FLT_MIN,FLT_MAX); printf("double 范围:%lf ~ %lf\n",DBL_MIN,DBL_MAX); } 输出: float 范围:0.000000 ~ 340282346638528859811704183484516925440.000000 double 范围:0.000000 ~ 179769313486231570814527423731704356798070567525844996598917476803157260780028538760589558632766878171540458953514382464234321326889464182768467546703537516986049910576551282076245490090389328944075868508455133942304583236903222948165808559332123348274797826204144723168738177180919299881250404026184124858368.000000 Process finished with exit code 0
-
精度问题
- float类型:
- 精度6-7位:
- 整数部分+小数部分<=6位,准确
- 整数部分+小数部分==7位,可能准确,也可能不准确
- 整数部分+小数部分>7位,不准确
- 精度6-7位:
- double类型
- 精度15-16位
- 整数部分+小数部分<=15位,准确
- 整数部分+小数部分==16位,可能准确,也可能不准确
- 整数部分+小数部分>16位,不准确
- 精度15-16位

- 不同平台、操作系统,对应float、double类型实现的精度有可能不同
bool类型
- C语言原来没有bool’类型。c99标准中,新增了bool类型。C++自带bool类型
- 用处:
- 表示:
- 好、坏
- 真、假
- 对、错
- 是、否
- 取值:
- true --真 --1
- false --假 – 0
- 表示:
- C语言适应bool的条件
- 编译器要支持c99标准
- 导入 #include<stdbool.h>
- bool类型大小
- 1 字节。可以使用
sizeof(bool)求取
- 1 字节。可以使用
- bool没有专用的格式匹配符。打印时,使用%d来打印
进制和转换
- 计算机只使用2进制
存储知识
- 1 bit位就是一个二进制位,只能存一个0或1
- 一个字节(Byte) 1B = 8bit位
- “内存单元” 是计算机内存存储的最小单位,一个内存单元 == 1字节
- 1kb = 1024B
- 1MB = 1024KB
- 1GB = 1024MB
- 1TB = 1024GB
2进制
-
取值1 或 0. 逢2进1,借1当2
-
没有格式匹配符
8进制
逢8进1,借1当8
取值0~7,最大值7
格式匹配符:%o
表示语法:0开头
8进制---->10进制:
- 056 ==81 * 5 + 80*6=46
- 0123 == 80 * 3 + 81 * 2 +82 * 1 ==83
10进制—>8进制:
- 除8反向取余
- 135-----0207
8进制---->2进制:
- 转换算法:将8进制数,自左向右,每一位用421码隔开
- 053261-------101011010110001(5用421码凑是101,3是011,以此类推)
2进制---->8进制
- 转换方法:自右向左,每三个二进制位一组,不足3位补0
- 1 101 010 101 111 010
- 不足3位用0补齐 001 101 010 101 111 010
- 152572(001用421码是 1,101是5,以此类推)
16进制
-
逢16进1,借1当16
-
取值:0~9 10-A/a 11-B/b 12 - C/c 13-D/d 14-E/e 15-F/f
-
格式匹配符:%x 或者%#x
-
表示语法:0x开头
-
16进制—>10进制
- 将每一个16金志伟,展开相加得到十进制
-
10进制—>16进制
- 除16反向取余法
- 37-----0x25
- 43----0x2B
- 除16反向取余法
-
16进制—>2进制
- 转换算法:将16进制数,自左向右,每一位用8421码展开
- 0xFAC12 --------F(F是15,用8421码拼是1111,A是10,用8421是1010,以此类推)-------11111010110000010010
- 转换算法:将16进制数,自左向右,每一位用8421码展开
-
2进制----->16进制
- 转换算法:自右向左,每4个二进制位一组,不足4位0补齐
- 101001011101011001
- 分组:10 1001 0111 0101 1001
- 补齐:0010 1001 0111 0101 1001
- 16进制数为:0x29759
-
小结
-
使用频率最高的是10进制,次高的:16进制
- int m = 0x15F4 16进制
- Int n = 0345 8进制
- int k = 01010101;
- 不能直接将变量赋值为2进制
- 这样赋值编译器会将它理解成8进制
-
// // Created by Lollipop on 2020/3/24. // #include<stdio.h> int main(void){ int a = 55; printf("10进制:a = %d\n",a); printf("8进制:a = %o\n",a); printf("8进制:a = %#o\n",a); //在%和o之间加一个#可以输出8进制前缀 0 printf("10进制:a = %x\n",a); printf("10进制:a = %#x\n",a); //在%和x之间加一个#可以输出16进制前缀 0x } 输出: 10进制:a = 55 8进制:a = 67 8进制:a = 067 10进制:a = 37 10进制:a = 0x37 Process finished with exit code 0
常用的格式匹配符
- %d
- %c
- %x
- %u
- %s---->打印字符串
- %f
- %#x
- %hhd
- %hd
- %ld
- %lld
- %hhu
- %hu
- %lu
- %llu
- %lf
-
编码和存储
无符号存储
unsigned int a = 12; //占用4个字节,32个bit位存储
空间:00000000 00000000 00000000 00000000 ------>4字节
存储:00000000 00000000 00000000 00001100
unsigned short b = 15; //占用2个字节,16和bit位存储
空间:00000000 00000000 ----->2字节
存储:00000000 00001111
有符号存储
-
需要拿出一个二进制位,专门存储符号。标识正、负
- 选用最高位位符号位
- 正:0
- 负:1
-
有符号正数:
-
//采用“源码存储” int a = 5; 空间:0 0000000 00000000 00000000 00000000 存储:0 0000000 00000000 00000000 00000101 ------标识存储正数5
-
-
有符号负数
-
有符号负数,采用“补码”存储
- 源码:数值的二进制位直接存储
- 反码:符号位不变,将其余数值取反
- 补码:反码+1
-
int b = -33; 空间:0 0000000 00000000 00000000 00000000 源码:1 0000000 00000000 00000000 00100001 反码:1 1111111 11111111 11111111 11011110 补码:1 1111111 11111111 11111111 11011111 ------>-33在计算机中实际存储 -
小结:
- int -----4字节------32bit位
- 有符号:31个数值位。取值范围:-231~231-1
- 无符号:32个数值位,取值范围:0~232-1
- short ------2字节-------16bit位
- 有符号:15个数值位。取值范围:-215~215-1
- 无符号:16个数值位。取值范围:0~216-1
- int -----4字节------32bit位
-
776

被折叠的 条评论
为什么被折叠?



