/*
* =====================================================================================
*
* Filename: data.c
*
* Description: 计算机中数的表示
*
* Version: 1.0
* Created: 2010年10月29日 10时00分08秒
* Revision: none
* Compiler: gcc
*
* Author: Yang Shao Kun (), cdutyangshaokun@163.com
* Company: College of Information Engineering of CDUT
*
* =====================================================================================
*/
原码=符号+绝对值;即是,将数的符号位化成0/1 表示,数的绝对值和符号一起编码。缺点:0的表示不唯一;
反码:将数字的符号位不变,然后其余的各项取反。比如:
X=-1100110,x原=111100110,x反=100011001;
那么我们可以看出反码和原码的关系为:
负数的反码的符号位和原码相同,其余的各位取反;
反码缺点:0的表示不唯一;
补码:我们知道计算机中,补码采用的是2的补码方式;2‘s complement
具体为:
负数先取反码再加1;(0的表示是唯一的)
浮点数在内存的存放:
符号位 指数位 尾数位
1 bit 7 bits 24 bits
这个和具体的编译系统有关;
指数位多,数的范围就越大,尾数位多,数就越精确。
我们现在知道,如果要表示一个不是小数的浮点数是比较容易的,那如果要表示一
个小数的时候该如何呢?
-1
比如:0.25=(0.1)*2,而我们的模型中没有规定如何表示符号位。
那么我们引入了"偏移的指数",具体是:
规定一个偏移值,实际的指数要在加上这个偏移值
在填写到指数部分。
那么:比偏移值大,正数,比偏移值小 ,负数。
但是我们又遇到个问题,那就是,我们的浮点数的表示不唯一,那么其在内存中
的存放形似也不通,那么,我们就要设计更多的电路来实现。
所以:我们就需要一个标准:
我们规定:
尾数部分的最高位必须是1 ,也就是说尾数必须以0.1开头。。
那么:由于尾数部分都是1,我们就可以不保存了(要注意);
sequence point and side effecf:
example: int a=0;a=a++;
安装运算符的优先级,应该先运算a++,在把表达式的值赋值给a。a的初值是0,
则表达式的a++的值是0,现在有两个side effect,一个是在计算表达式a++之后
应该把a改成1,另外的一个是把表达式a++的值0赋给等号左边的a,那个先发生不一定。
所以 结果:a的值是undefined。