1 ,变量在内存中的存储
Microsues 发的微薄:
C++ 中,把负值赋给 unsigned 对象是合法的,其结果是该负数对该类型的取值个数求模后的值。例如:把 -1 赋给 8 位的 unsigned char ,因为 -1 对 256 求模后的值为 255 ,所以结果是 255 。
我的回复:
c/c++ 中赋值很随意的,只需要做好 " 合法 " 的类型转换。本质上是数 / 对象如何在机器中表示的问题,一个内存中的数,可以是 char, int, pointer, double.... 任何类型。你的例子中 , 内存中写入了一个 0xFF 字节,而
0xFF=-1(char)=255(u char)=3.57331e-043(float)=......
为此我写了两行代码
这两行代码的输出是:
也就是说 0x000000FF 表示浮点数的 3.57331e-043 ,看起来有点不可思议,这是怎么来的呢?
2 :浮点数在内存中的表示
IEEE 规定,浮点标准用
形式来表示一个数,其中:
S 是符号 (sign) , M 是有效数 (significand) ,指数2 的 E 次幂,注意是2 不是 10 。
浮点数的位分成三个区域表示这些值:
1)s=1 个符号位 s ,直接编码 S
2) k 位的指数编码 E
3) n 位小数编码 M
在 C 语言中, float 类型对应 s=1, k = 8, n=23 ,表示 32 位的浮点数, double 类型对应 s=1,k=11,n=52 的 64 位浮点数。