extlpf 发表于 2012-10-28 16:32:32

再出一题目,想想看到底是USTC还是SSE?

本帖最后由 extlpf 于 2012-10-28 16:31 编辑

承诺再出一个题的,哈哈。以后没事就上来出个小题难为一下同学们,嘿嘿~
不过这次的题比较二,涉及一个很拐弯抹角的知识点,有兴趣就回复一下啦~~

还是读程序,写结果,并解释原因(标准C)。

#include <stdio.h>

union number {
    int i;
    float f;
} n1, n2, n3, n4;

int main(int argc, char* argv[]) {
    n1.i = n2.i = 0xffff0000;
    n3.i = n4.i = 0x0000ffff;
    if(n1.f == n2.f) printf("USTC");      
    if(n3.f == n4.f) printf("SSE");
    return 0;
}

390125133 发表于 2012-10-28 18:48:57

本帖最后由 390125133 于 2012-10-28 19:32 编辑

结果SSE,首先Union内存空间共享,n1.f、n2.f存放的就是ffff0000,按IEEE 754标准,阶码为FF,数符为1,尾数非0,存放的数是错误的数,错误的数比较结果都是FALSE,n3.f、n4.f存放的就是0000ffff,阶码为00,再减去偏移7F,是个非常小的正数,几乎为0,printf出来确实为0,<float.h>中 #define FLT_EPSILON   1.192092896e-07F 比较时两数的误差在此范围内,认为相等,n3.f、n4.f是相等的,如果百度都出这种题,我看我还是不要当炮灰了,回答学长一个问题,都老伤神了,也难怪前几天面试百度的学长全军覆没了

hslx111 发表于 2012-10-28 19:24:24

结果同上。
共同体每次只能存储一个值,所以它的长度等于其最大成员的长度,也就是float 32位。
其他的楼上都说了,我就不重复了。

extlpf 发表于 2012-10-29 23:59:26

390125133 发表于 2012-10-28 18:48 static/image/common/back.gif
结果SSE,首先Union内存空间共享,n1.f、n2.f存放的就是ffff0000,按IEEE 754标准,阶码为FF,数符为1,尾数 ...

完全正确哇!
这个题目源自Clemson一个美国同学的板书,我拿来改造了一把就是这个样子了。
话说这个就是拿来故意刁难人的,哈哈。公司的笔试是绝对不会出这么二的题的,放心吧~

世俗的程序员 发表于 2013-4-3 00:12:34

都好牛啊,看都看不懂解析。{:6_193:}

二休的歌 发表于 2013-4-3 08:25:17

{:6_194:}好强大
页: [1]
查看完整版本: 再出一题目,想想看到底是USTC还是SSE?