今天翻了翻斯坦福大学的programming paradigms公开课,
lecture 1讲c的数据结构。
其中老师举例:
float f = 7.0;
short s = f;
printf("s=%d\n", s);
结果是:s=7。
假设short占2字节,float占4字节,赋值的时候简单的做了一个截断,所以结果为7(但其实bit pattern还是经过了重新计算)。
然后:
float f = 7.0;
short s = *(short *) &f;
printf("s=%d\n", s);
分析:*(short *) &f 是说赋值的时候将f视为short类型,所以*(short *)&f只能取到f的前两个字节。结果就变成了f前两个字节存储的是什么。
根据float的表现方式:(-1)*2^0 * (1.xxxx)*2^(exp-127)
7.0 = 3.5 * 2 = 1.75 * 2^2
所以exp=129, s=0, 即前9位是0 10000001,结果不可能为0啊
知道怎么回事么?
lecture 1讲c的数据结构。
其中老师举例:
float f = 7.0;
short s = f;
printf("s=%d\n", s);
结果是:s=7。
假设short占2字节,float占4字节,赋值的时候简单的做了一个截断,所以结果为7(但其实bit pattern还是经过了重新计算)。
然后:
float f = 7.0;
short s = *(short *) &f;
printf("s=%d\n", s);
分析:*(short *) &f 是说赋值的时候将f视为short类型,所以*(short *)&f只能取到f的前两个字节。结果就变成了f前两个字节存储的是什么。
根据float的表现方式:(-1)*2^0 * (1.xxxx)*2^(exp-127)
7.0 = 3.5 * 2 = 1.75 * 2^2
所以exp=129, s=0, 即前9位是0 10000001,结果不可能为0啊
知道怎么回事么?
