一、字符型在内存中的储存
1、认识ASCII
(American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。
2、ASCLL码的大小规则
常见ASCII码的大小规则:0~9<A~Z<a~z。
1)数字比字母要小。如 “7”<“F”。
2)数字0比数字9要小,并按0到9顺序递增。如 “3”<“8‘’。
3)字母A比字母Z要小,并按A到Z顺序递增。如“A”<“Z” 。
4)同个字母的大写字母比小写字母要小32。如“A”<“a” 。
3、 认识char
1、在计算机内部,字符类型使用一个字节(8位)存储。
2、C 语言将其当作整数处理,所以字符类型就是宽度为一个字节的整数。
3、每个字符对应一个整数(由 ASCII 码确定),比如A对应整数
65
。5、既然是以整数形式储存,那么就存在有符号型(signed)和无符号型(unsigned)两种
4、char 是否有符号,默认取决于编译器 有符号取值范围:(-128——127)无符号取值范围:(0 -——255)
当二进制最高位为0时无符号的char与有符号的char相同
当二进制最高位为1时,内存中为补码
int main()
{
char b = 'A';
printf("%d\n", b); // 打印出Ascll码值65
printf("%c\n", b); // 打印字符为 A
char a = -1;
// 原码 10000000000000000000000000000001
// 反码 11111111111111111111111111111110
// 补码 11111111111111111111111111111111
// 由于char类型 为1字节 8bite位 需要截断
// 11111111
// 所以-1在内存中储存为11111111
// 打印时需整型提升 且为有符号整型
// 负整数补1
// 补码 11111111111111111111111111111111
// 原码 10000000000000000000000000000001
// -1
printf("%d\n", a); // 打印出有符号值:-1
// 打印时为无符号
// 原反补相同 11111111111111111111111111111111
printf("%u\n", a); // 打印出无符号值: 4294967295
return 0;
}
当超出char类型范围时,char会按照图中循环方式进行储存值,本质是由整型提升导致的
二、整数类型在内存中储存形式
int main()
{
int a = -20;
//原 10000000000000000000000000010100
//反 11111111111111111111111111101011
//补 11111111111111111111111111101100
printf("%d\n", a); // -20
printf("%u\n", a); // 4294967276 打印无符号时,补码为原码
unsigned int b = 10;
//原 00000000000000000000000000001010
// 11111111111111111111111111101100 -20
// +00000000000000000000000000001010 10
//补11111111111111111111111111110110 -10
// 转化为原码减一变反码
//反11111111111111111111111111110101
//原10000000000000000000000000001010 -10
printf("%d\n", a + b);// -10
// 11111111111111111111111111110110 打印无符号 补码不用变原码
printf("%u\n", a + b);// 4294967286
return 0;
}
三、浮点型在内存中的储存形式
(-1) ^S * M * 2 ^E
(-1) ^S 表示符号位 ,当s=0, V为正数;当s=1, V为负数
M表示有效数字,M大于等于1,小于2
2^E表示指数位
int main()
{
float a = 5.5f;
// 5.5 -> 十进制
// 101.1 -> 二进制
// 1.011 * 2^2 -> 2的2次方表示小数点往前移两位
// (-1)^0 * 1.011 * 2^2 -> 二进制浮点数的表现形式
// (-1)^S * M * 2 ^E
// S = 0 M = 1.011 E = 2 + 127 = 129
// S E M
// 0 10000001 01100000000000000000000
// 0100 0000 1011 0000 0000 0000 0000 0000
// 8421
// 40 a0 00 00 -> 8进制
return 0;
}