1. 程式人生 > >2018-2019-1 20165322《信息安全系統設計基礎》第2周學習總結

2018-2019-1 20165322《信息安全系統設計基礎》第2周學習總結

小數 分享圖片 基礎 位運算 href oat 語言 計算 實現

課本學習筆記

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

學習疑問及解決

  • 邏輯運算是否按位運算?
    • 答:不是,例如將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應該是按位循環來實現判斷功能的,所以我依然沒有明白這段函數的輸入口在哪裏。。。不過大致讀懂了這段代碼。

參考文檔

  • https://www.cnblogs.com/chengxuyuancc/archive/2013/09/22/3330776.html
  • https://blog.csdn.net/SamWoog/article/details/78034189

2018-2019-1 20165322《信息安全系統設計基礎》第2周學習總結