索引
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