深入理解计算机系统--信息表示和处理
2014-03-08 21:40
519 查看
第二章 学习小记
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
*/
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
*/
相关文章推荐
- 使用 Libki 来管理公共用户访问计算机
- 微型计算机的始祖:Altair 8800
- 通过手机、电脑远程开关机,Windows和linux机手机,电脑相互控制
- 第一台冯·诺伊曼结构量子计算机售价1000万美元
- 首台“混合”超级计算机突破千万亿次计算大关
- 代理服务器
- 2008年最新最全计算机相关精品资源学习“宝典”系列典藏版电子书
- OSTA考试认证详细介绍之计算机
- 计算机网络安全与防火墙技术
- Ubuntu apt-get详解
- 深入理解HTTP协议
- 35场面试,应届计算机毕业生的霸气求职之路
- 开源 Apache 服务器安全防护精要
- 开源与Linux思维
- 对技术的态度
- 基于Linux的防火墙不安全
- 资深推荐:七款Linux防火墙图文说明(附下载)
- 专注于服务器操作系统的FreeBSD是如何炼成的
- 为什么用GPU挖比特币?
- 海盗湾联合创始人在瑞典被判入狱两年