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

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

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

[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;
}

评分

参与人数 1学分 +12 收起 理由
admin + 12 鼓励类似经验技术交流!

查看全部评分

共收到 5 条回复
390125133 · #2 · 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是相等的,如果百度都出这种题,我看我还是不要当炮灰了,回答学长一个问题,都老伤神了,也难怪前几天面试百度的学长全军覆没了

点评

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

评分

参与人数 1学分 +6 收起 理由
admin + 6 鼓励参与技术讨论!

查看全部评分

hslx111 · #3 · 2012-10-28 19:24:24  回复 支持 反对
结果同上。
共同体每次只能存储一个值,所以它的长度等于其最大成员的长度,也就是float 32位。
其他的楼上都说了,我就不重复了。

评分

参与人数 1学分 +6 收起 理由
admin + 6 鼓励参与技术讨论!

查看全部评分

extlpf · #4 · 2012-10-29 23:59:26  回复 支持 反对
390125133 发表于 2012-10-28 18:48
结果SSE,首先Union内存空间共享,n1.f、n2.f存放的就是ffff0000,按IEEE 754标准,阶码为FF,数符为1,尾数 ...

完全正确哇!
这个题目源自Clemson一个美国同学的板书,我拿来改造了一把就是这个样子了。
话说这个就是拿来故意刁难人的,哈哈。公司的笔试是绝对不会出这么二的题的,放心吧~
世俗的程序员 · #5 · 2013-4-3 00:12:34  回复 支持 反对
都好牛啊,看都看不懂解析。
二休的歌 · #6 · 2013-4-3 08:25:17  回复 支持 反对
好强大
回帖
B Color Image Link Quote Code Smilies
Command + Enter
快速回复 返回顶部 返回列表