2017-2018-1 20155314 《信息安全系統設計基礎》第3周學習總結

2017-2018-1 20155314 《信息安全系統設計基礎》第3周學習總結

教材學習內容總結

學習目標

  • 理解二進制在計算機中的重要地位
  • 掌握布爾運算在C語言中的應用
  • 理解有符號整數、無符號整數、浮點數的表示
  • 理解補碼的重要性
  • 能避免C語言中溢出,數據類型轉換中的陷阱和可能會致使的漏洞
  • 進一步理解「信息=位+上下文」

教材內容提煉

第2章 信息的表示和處理

  • 三種最重要的數字表示
    • 無符號編碼:表示大於或等於零的數字
    • 補碼編碼:表示有符號整數的最多見方式
    • 浮點數編碼:表示實數的科學記數法的以2爲基數的版本
  • 信息存儲
    • 虛擬內存:機器級程序將內存視爲一個很是大的字節數組,稱爲虛擬內存
    • 十六進制表示法
    • 字數據大小
      • 一個字長爲w位的機器,虛擬地址的範圍爲0~2^w-1,程序最多訪問2^w個字節
      • 向後兼容:大多數64位機器也能夠運行爲32位機器編譯的程序
      • ISO C99引入一類數據類型,其數據大小是固定的,不隨編譯器和機器設置而變化
        • int32_t:4字節
        • int64_t:8字節
      • 對關鍵字的順序以及包括仍是省略可選關鍵字來講,C語言容許存在多種形式:如 unsigned longunsigned long intlong unsignedlong unsigned int均等價
    • 尋址和字節順序
      • 小端法:最低有效字節在最前面
      • 大端法:最高有效字節在最前面
    • 表示字符串
    • 表示代碼
    • 布爾代數簡介
      • 布爾環中加法運算是^,每一個元素的加法逆元都是它本身自己,即對於任何值a,a^a=0
    • C語言中的位級運算(按位布爾運算)
      • |
      • &
      • ~
      • ^
    • C語言中的邏輯運算(邏輯運算認爲全部非零的參數都表示TRUE(返回1),而參數0表示FALSE(返回0))
      • ||
      • &&
      • !
    • C語言中的移位運算
      • 左移
      • 右移
        • 邏輯右移:在左端補k個0
        • 算術右移:在左端補k個最高有效位的值
  • 整數表示
    • 整型數據類型
    • 無符號數的編碼
    • 補碼編碼
    • 有符號數和無符號數之間的轉換
    • C語言中的有符號數與無符號數
    • 擴展一個數字的位表示
    • 截斷數字
    • 關於有符號數與無符號數的建議
  • 整數運算
    • 無符號加法
    • 補碼加法
    • 補碼的非
    • 無符號乘法
    • 補碼乘法
    • 乘以常數
    • 除以2的冪
    • 關於整數運算的最後思考
  • 浮點數
    • 二進制小數
    • IEEE浮點表示
    • 數字示例
    • 舍入
    • 浮點運算
    • C語言中的浮點數
      • int轉成float:數字不會溢出,但可能被舍入
      • intfloat轉成double:能保留精確的數值
      • double轉成float:值可能溢出成+∞或-∞,還可能被舍入
      • floatdouble轉成int:值將會向零舍入

課後實踐:myod

實踐要求

  1. 複習c文件處理內容html

  2. 編寫myod.c 用myod XXX實現Linux下od -tx -tc XXX的功能java

  3. main與其餘分開,製做靜態庫和動態庫git

  4. 編寫Makefile編程

  5. 提交測試代碼和運行結果截圖, 提交調試過程截圖,要全屏,包含本身的學號信息數組

  6. 在博客園發表一篇博客,重點寫遇到的問題和解決過程sass

個人代碼

#include<stdio.h>
#include<stdlib.h>
void myod(char *f);
int main(int argc,char *argv[]){
    myod(argv[1]);
    return 0;
}

void myod(char *f){
    FILE *fp;
    char ch;
    char str[16];
    int i=0,j,count=0;
    if((fp=fopen(f,"r"))==NULL){
        printf("ERROR!\n");
        exit(0);
    }
    while((ch=fgetc(fp))!=EOF){
        str[i]=ch;
        i++;
        if(i==16){
             i=0;
         printf("%07o    ",count);
             for(j=0;j<16;j++){
                 if(str[j]=='\n') printf("\\n  ");
                 else printf("%-4c",str[j]);
         count++;
         }
             printf("\n");
             printf("           ");
             for(j=0;j<16;j++)
             printf("%02x  ",str[j]);
             printf("\n");    
    }
    }
    printf("%07o    ",count);
    for(j=0;j<i;j++){
        if(str[j]=='\n') printf("\\n  ");
        else printf("%-4c",str[j]);
    count++;
    }
    printf("\n");
    printf("           ");
    for(j=0;j<i;j++)
    printf("%02x  ",str[j]);
    printf("\n");
    printf("%07o    ",count);
    printf("\n");
    fclose(fp);
}

運行截圖

教材學習中的問題和解決過程

  • 問題1:什麼是GCC?
    • GCC(GNU Compiler Collection,GNU編譯器套件),是由 GNU 開發的編程語言編譯器。它是以GPL許可證所發行的自由軟件,也是 GNU計劃的關鍵部分。GCC本來做爲GNU操做系統的官方編譯器,現已被大多數類Unix操做系統(如Linux、BSD、Mac OS X等)採納爲標準的編譯器,GCC一樣適用於微軟的Windows。
  • 問題2:什麼是彙編和反彙編?
    • 彙編(Assembly):把彙編語言翻譯成機器語言的過程
    • 反彙編(Disassembly):把目標代碼轉爲彙編代碼的過程
  • 問題3:什麼是GUI?
    • 圖形用戶界面(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)是指採用圖形方式顯示的計算機操做用戶界面。

代碼調試中的問題和解決過程

  • 問題1:git add .時報錯:fatal: Not a git repository (or any of the parent directories)
  • 解決方案:這是因爲本地版本管理倉庫被刪除了,須要用git init命令從新初始化倉庫,創建新的倉庫:
  • 問題2:git push時報錯:fatal: The current branch master has no upstream branch.
  • 解決方案:利用git push -u origin master -f命令強制覆蓋已有的分支後再push,push成功:

代碼託管

上週考試錯題總結

結對及互評

本週結對學習狀況

  • 20155323
  • 結對學習內容
    • 教材第1章 計算機系統漫遊

其餘(感悟、思考等,可選)

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第一週 200/200 2/2 20/20

嘗試一下記錄「計劃學習時間」和「實際學習時間」,到期末看看能不能改進本身的計劃能力。這個工做學習中很重要,也頗有用。
耗時估計的公式
:Y=X+X/N ,Y=X-X/N,訓練次數多了,X、Y就接近了。安全

參考:軟件工程軟件的估計爲何這麼難軟件工程 估計方法編程語言

  • 計劃學習時間:5小時工具

  • 實際學習時間:2小時學習

參考資料

相關文章
相關標籤/搜索