第二章 学习小记
3月3日买上这本书,每天都在看,现在一周后看完了前两章。
原来就听说这本书很好,这学期也学计算机组成原理,就买来学习。
首先一个感受是知道了学这些很细微的系统方面的知识对编程意义。
有符号数到无符号数的隐式强制类型转换可能导致程序错误,如getpeername的安全漏洞,还有如乘法的溢出。原来写一些代码都没有考虑过安全性,现在觉得要注重这些细节,养成好的习惯。
还有这本书确实比教科书讲的深入。
浮点表示IEEE754标准中有一个阶码要偏置是2^(n-1)-1,而非通常的2^(n-1),这本书讲的很详细,是因为从非规格化值平滑转换到规格化的值。并通过具体的例子看出补偿非规格化数的尾数没有隐含开头的1,所以这样设置偏置值。
#include<stdio.h>//本觉得书B28上的一个小程序没什么意思,仔细探究了一下还挺深的...
typedef unsigned char *byte_pointer;//强制类型转换
void show_bytes(byte_pointer start,int len)
{
int i;
for(i = 0;i < len;i++)
{
printf("%.2x ",start[i]);//.2x 整数必须用至少两个数字的十六进制格式输出
}
printf("\n");
}
void show_int(int x)
{
show_bytes((byte_pointer) &x,sizeof(int));
}
void show_float(float x)
{
show_bytes((byte_pointer) &x,sizeof(float));
}
void show_pointer(void *x)
{
show_bytes((byte_pointer) &x,sizeof(void *));
}
int main()
{
float x = -0.5;
//show_int(x);//{cc*4}
show_float(x);//{cc*4}
//show_pointer(x);//{cc*4}
return 0;
}
/*
结论:little endian用小端法存数
如果不初始化x,结果都为:cc cc cc cc
x = 1: 01 00 00 00
x = 1000: e8 03 00 00
x = 1024: 00 04 00 00
x = 0: 00 00 00 00
x = -0.5: 00 00 00 bf
x = -1: ff ff ff ff
x = -2: fe ff ff ff
x = 0.1: cd cc cc 3d //会有误差
x = 0.5: 00 00 00 3f
x = 1.5: 00 00 c0 3f
x = 173507: c0 70 29 48 //p48 计组书上此题不是用的IEEE 754标准
x = 22.78125: 00 40 b6 41 //p58
*/