Saturday 24 May 2014

Data In Memory (C++) [Contains Chinese]

I found a better source:
http://help.topcoder.com/data-science/competing-in-algorithm-challenges/algorithm-tutorials/representation-of-integers-and-reals/

1. Int (32bits)
Range: (-2^31+1, 2^31-1)
Positive: [0] [XXXXXXX XXXXXXXX XXXXXXXX XXXXXXXX]
Negative: save the complement.
Given: -10
1) abs (-10) = 10 -> XXX 00001010 (X: 0)
2) adverse: -> XXX 11110101 (X:1)
3) +1: -> XXX 11110110 (X:1)

2. Unsigned Int
There is no sign digit.

3. short int
-32768~32767
-32768: [1] [000000 00000000 00000000 00000000]
32767:  [0] [111111 1111111 1111111 1111111]











4: float
在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+尾数(M)。
对于float型数据,其二进制有32位,其中符号位1位,阶码8位,尾数23位;
对于double型数据,其二进制为64位,符号位1位,阶码11位,尾数52位。
-------------------------------------
                31        30-23       22-0
float       符号位     阶码        尾数
                63        62-52       51-0

double    符号位     阶码        尾数
------------------------------------------
符号位:0表示正,1表示负
阶码:这里阶码采用移码表示,对于float型数据其规定偏置量为127,阶码有正有负,对于8位二进制,则其表示范围为-128-127,double型规定为1023,其表示范围为-1024-1023。

尾数:有效数字位,即部分二进制位(小数点后面的二进制位),因为规定M的整数部分恒为1,所以这个1就不进行存储了。
------------
for example:
float型数据125.5转换为标准浮点格式
125二进制表示形式为1111101,小数部分表示为二进制为 1,则125.5二进制表示为1111101.1,由于规定尾数的整数部分恒为1,则表示为1.1111011*2^6,阶码为6,加上127为133 (+127的目的是防止出现阶码为负的可能性),则表示为10000101,而对于尾数将整数部分1去掉,为1111011,在其后面补0使其位数达到23位,则为11110110000000000000000
则其二进制表示形式为
0 10000101 11110110000000000000000,则在内存中存放方式为:
00000000   低地址
00000000
11111011
01000010   高地址

No comments:

Post a Comment