C语言——数据在内存中储存(字符char、整型int、单精度浮点float)

一、字符型在内存中的储存

1、认识ASCII

        (American Standard Code for Information Interchange): 美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准ISO/IEC 646。

        

95fd3fdaeb114c088394c01979848c2a.png

 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;
}

 

 

9c4b9d2bae324b0382503d35ff0869cd.png

 8ea0db659c5043f3a0e043a9b7e25354.jpeg

 当超出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表示指数位

27948582efda4846abdc7d34c28ef242.png

 

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;
}

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

头发丝儿~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值