首页 > 其他 > 详细

2018-2019-1 20165322《信息安全系统设计基础》第2周学习总结

时间:2018-09-30 23:47:24      阅读:252      评论:0      收藏:0      [点我收藏+]

课本学习笔记

技术分享图片

技术分享图片

技术分享图片

技术分享图片

学习疑问及解决

  • 逻辑运算是否按位运算?
    • 答:不是,例如将0x40看成是一个数,这个数非1即0.因此计算时只有0x00与0x01两种结果
  • C语言中浮点数向零舍入取整的方法
    • 思路就是先把double强转成unsigned,然后再把unsigned重新强转成int。参考代码见这里
  • 阶码的作用
    • 阶码指明了小数在数据中的位置

练习

  • 2.96
    由于不会写,我在网上找到了类似题目要求的代码
#include <stdio.h>

typedef unsigned float_bits;
#define TMin 0x80000000

int float_f2i(float_bits f)
{
    unsigned sign, exp, frac, last_bit;
    int i;

    sign = f >> 31;
    exp = (f >> 23) & 0xff;
    frac = f & 0x7fffff;

    if (exp == 158 && frac == 0 && sign == 1)  //处理f = TMin的情况
        i = TMin;
    else if (exp > 157 || exp == 0xff)  //处理f上溢出或f是NaN的情况
        i = TMin;
    else if (exp < 126)  //处理f下溢出
        i = 0;
    else
    {
        exp -= 127;
        frac |= 0x800000;
        if (exp > 23)
        {
            exp -= 23;
            frac <<= exp;
        }
        else if (exp < 23)
        {
            exp = 23 - exp;
            frac >>= exp;
        }
        if (sign == 1)
            i = (~frac) + 1;
        else
            i = frac;
    }
    return i;
}
int main(void)
{
    unsigned i;
    int j, k;
    float f;

    for (i = 0x3fbfff70U; i <= 0xffffffffU; i++)
    {
        f = *(float *)&i;
        j = (int)f;
        k = float_f2i(i);
        printf("%f : %d  %d\n", f, j, k);
    }
    return 0;
}

我将它在虚拟机上实现,运行时出现以下问题——它无法停止运行。
技术分享图片

代码行中for循环i的意义我没弄明白。于是我尝试将循环删除,留下中间计算的值,此时选值i应该是个随机值。
技术分享图片

尴尬的是我试图将f变成一个键入的值时,我发现i应该是按位循环来实现判断功能的,所以我依然没有明白这段函数的输入口在哪里。。。不过大致读懂了这段代码。

参考文档

2018-2019-1 20165322《信息安全系统设计基础》第2周学习总结

原文:https://www.cnblogs.com/wangyaojia/p/9733673.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!