错误类型总结+补码+大小端+浮点数在内存中的存储(进阶一)

本文详细介绍了编程中常见的运行错误、编译错误和链接错误,包括它们的实例和产生原因。同时,深入探讨了数据在内存中以补码形式存储的原因,以及char和unsigned char类型的取值范围。此外,解释了计算机系统中的大小端存储模式及其由来,并提供了判断数据存储方式的代码示例。最后,根据IEEE 754标准解析了浮点数的存储规则,包括特殊情况的处理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,运行错误

运行错误是指代码逻辑无措,由于编译器无法发现运行时错误,这些错误往往是在程序运行时以五花八门的形式表现出来。
(1)WindowsXP错误报告
(2)内存不能为Read/Written
(3)非法操作
(4)Debug错误

主要产生的原因
考虑不周或输入错误导致程序异常
比如数组越界访问,除数为零,堆栈溢出。
程序设计思路的错误导致程序异常或难以得到预期的效果
比如使用失效的迭代器

2,编译错误

写代码不规范,语法错误,主要有两种情况:
(1)书写错误
(2)用法错误

3,链接错误

(1)项目工程与第三方库版本不一致,比如工程师64位的,而库是32位的;
(2)找不到相应的库文件。
使用第三方库,如OPenCV,只包含头文件没有引入库文件;
微软自带的库,链接失败的函数所在的头文件在项目属性的包含目录下,但是相应的库文件却不在项目属性的默认库目录里

4,为什么数据在内存中储存的是补码

在计算机系统中数值一律用补码的形式来表示和存储。原因是:使用补码时,可以将符号位和数值位统一处理;同时加法和减法也可以统一处理(CPU只有加法器)此外,补码与原码相互转换,其运算结果是相同的,不需要额外的硬件电路。(原码取反加1变成补码,补码取反加1可以变会原码)
其次存放补码可以保证计算的准确性。
eg:
我们计算1-1;

在这里插入图片描述

(补充)char/unsigned

unsigned char:0~255
char:-128~ 127计算机中1后面七个0也就是10000000无法解析也就直接被解析成-128所以char的取值范围是-128 ~ 127;

5,大小端

1,什么是大小端

**大端(**存储)模式,是指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中;
小端(存储)模式,是指数据的低位保存在内存的低地址中,而数据的高位,,保存在内存的高地址中。

2,为什么会有大小端

为什么会有大小端模式之分呢?这是因为在计算机系统中,我们是以字节为单位的,每个地址单元
都对应着一个字节,一个字节为8
bit。但是在C语言中除了8 bit的char之外,还有16 bit的short型,32 bit的long型(要看具体的编译器),另外,对于位数大于8位
的处理器,例如16位或者32位的处理器,由于寄存器宽度大于一个字节,那么必然存在着一个如何将多个字节安排的问题。因此就
导致了大端存储模式和小端存储模式
我用一张图和编译器调试来展示一下:
在这里插入图片描述

面试题: 4,如何判断编译器当前的数据储存的大小端
int a = 1;
	//a是四个字节的,我们在内存中可能是00 00 00 01(大端存储)
	//也有可能是这样的01 00 00 00(小端存储)
	int b = *(char*)&a;//先取a的地址然后强制转化为char*再解引用,
	//就可
	//以取到a在内存中第一个字节了.
	if (b == 1)
		printf("小端储存\n");
	if (b == 0)
		printf("大端存储\n");

6,浮点数的存储

先看一张图
在这里插入图片描述
为什么会这样?

1,浮点数存储规则

根据国际标准IEEE(电气和电子工程协会) 754,任意一个二进制浮点数V可以表示成下面的形式:
(-1)^S * M * 2^E
(-1)^s表示符号位,当s=0,V为正数;当s=1,V为负数。
M表示有效数字,大于等于1,小于2。
2^E表示指数位
举例来说:
十进制的5.0,写成二进制是 101.0 ,相当于 1.01×2^2 。
那么,按照上面V的格式,可以得出s=0,M=1.01,E=2。

在这里插入图片描述

2,M和E的特殊规定
1,M

之前见过1<=M<2,M一定可以表示成1.XXXXXXXX,为了节省一位有效数字,计算规定在计算机内部保存M时,直接把1舍去,只保存后面的,例如:1.001只保存001前面的1舍去,这样当村粗的是32位单精度浮点型的时候就会有24位有效位了

2,E

首先E是一个无符号整形,这意味着,当E是8位的时候,它的取值范围是0~255,当E是11位的时候,它的取值范围是0-2047,但是可以了解到,由于有效数字的M始终是大于1的,那么我们的指数E是有可能出现负数的,所以
所以IEEE 754规定,存入内存时E的真实值必须再加上一个中间数,对于8位的E,这个中间数是127;对于11位的E,这个中间数是1023。比如,2^10的E是10,所以保存成32位浮点数时,必须保存成10+127=137,即10001001
现在又有了三种特殊的情况:

1E不全为0或不全为1

这时,浮点是就用上述规则表示
例如:0.75的二进制表示是0.11,(2^-1 +2^-2 = 0.75)由于规定整数部分必须大于等于1,所以这个时候将小数点右移一位,所以这个时候表示成1.1*(2^-1)其E值变成了-1+127 = 126,表示成01111110,而有效数字再去掉1后剩下1,补齐到23位
10000000000000000000000
所以该浮点数字在内存中的二进制表示为:

0 01111110 10000000000000000000000

E全为0

这时,浮点数的指数E等于1-127(或者1-1023)即为真实值,
有效数字M不再加上第一位的1,而是还原为0.xxxxxx的小数。这样做是为了表示±0,以及接近于0的很小的数字

E全为1

这时,如果有效数字M全为0,表示±无穷大(正负取决于符号位s

解释题目

在这里插入图片描述

评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

每天少点debug

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

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

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

打赏作者

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

抵扣说明:

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

余额充值