标签:
【学习时间:6 hours】
【学习任务:仔细研读《深入理解计算机系统》第二章内容,掌握整数表示、浮点数表示及其运算】
整数运算和浮点数运算会有不同的数学属性是因为他们处理数字表现有限性的方式不同。整数的表示虽然只能编码一个较小的范围,但这种表示是精确的;而浮点数表示的范围相对较大,但是这种表示只是近似的。
#include <stdio.h>
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]);
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*));
}
void test_show_bytes(int val) {
int ival = val;
float fval = (float) ival;
int *pval= &ival;
show_int(ival);
show_float(fval);
show_pointer(pval);
}
void main()
{
int val;
printf("please input the num :");
scanf("%d", &val);
test_show_bytes(val);
}
windows下执行结果如下:
正常:
运行错误:
在lenght=0时,本应该是返回0.0的函数出现了存储器错误。系统提示检测到错误。发现定义的length是unsigned,按照无符号运算的话,结果会是Umax。不等式恒成立。循环就会自动访问a的所有元素直到访问到非法元素。
修改:将length的定义成int即可。
因为机器有的限制,只要两个运算数进行运算的结果超过Umax或者Umin,就会发生溢出。避免溢出,将运算结果控制在-2^(w-1)---2^(w-1)-1中间;或者增加if语句判断运算数的是否合法。
A:(x<<n)+(x<<n-1)+……+(x<<m)
B:(x<<n+1)-(x<<m)
例:fffffe58,计算方法 -16^3+1416^2+516+8
y+x=2^w
若x=0,则y=0
截断,无符号数,截断值直接为模2^3的余数,有符号数余数的值带入 U2Tw(x)中的结果为最后的结果。
U2Tw(x)=y的计算方法:
x<2^(w-1)
y=x
x>=2^(w-1)
y=x-2^w
移动24位之后只看最后两位,fun1前面均补0;fun2前两个倒数第二位均小于8,所以前面都补0,后两个数对应位置均大于等于8,所以前面补1。
造成差异的原因:int的位置不同
精度和范围:double>int>float
距参数越近,需要的精度和范围越高。
本次学习,一开始看知识点时并不是很清楚,后来经过练习,翻阅答案,从答案中找出规律,从而对公式及解题方法有了更深的了解。
标签:
原文地址:http://www.cnblogs.com/shadow135211/p/4854920.html