2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结
2017-2018-1 20155229 《信息安全系統(tǒng)設(shè)計(jì)基礎(chǔ)》第十三周學(xué)習(xí)總結(jié)
對(duì)“第二章 信息的表示和處理”的深入學(xué)習(xí)
- 這周的任務(wù)是選一章認(rèn)為最重要的進(jìn)行學(xué)習(xí),我選擇了第二章。當(dāng)今的計(jì)算機(jī)存儲(chǔ)和處理信息基本上是由二進(jìn)制(位)組成,二進(jìn)制能夠很容易的被表示、存儲(chǔ)和傳輸。當(dāng)把位組合在一起,再加上某種解釋,即給不同的可能位模式賦予含義,我們就能表示任何有限集合的元素。而正因?yàn)樾畔⒈硎竞吞幚硎怯?jì)算機(jī)最基礎(chǔ)的東西,我認(rèn)為弄懂基礎(chǔ)是很有必要的。
第二章主要是研究計(jì)算機(jī)上如何表示數(shù)字和其他形式數(shù)據(jù)的基本屬性,以及計(jì)算機(jī)對(duì)這些數(shù)據(jù)執(zhí)行操作的屬性,計(jì)算機(jī)系統(tǒng)規(guī)定了三種重要的編碼方式:無符號(hào)編碼、補(bǔ)碼編碼、浮點(diǎn)數(shù)編碼。
無符號(hào)編碼:基于傳統(tǒng)的二進(jìn)制表示法,表示大于或等于0的數(shù)字。
補(bǔ)碼編碼:表述有符號(hào)整數(shù)的常見方式,正或負(fù)的數(shù)字。
浮點(diǎn)數(shù)編碼:表示實(shí)數(shù)的科學(xué)計(jì)數(shù)法的以二進(jìn)制為技術(shù)的版本。
將本章分為三個(gè)模塊
一、信息存儲(chǔ)
二、整數(shù)表示及運(yùn)算
三、浮點(diǎn)數(shù)
一、信息存儲(chǔ)
大端小端
大端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的高地址中,而數(shù)據(jù)的高位,保存在內(nèi)存的低地址中;
小端模式,是指數(shù)據(jù)的低位保存在內(nèi)存的低地址中,而數(shù)據(jù)的高位保存在內(nèi)存的高地址中。
1.為什么會(huì)有大小端之分
在計(jì)算機(jī)系統(tǒng)中,是以字節(jié)為單位的,每個(gè)地址單元都對(duì)應(yīng)著一個(gè)字節(jié),一個(gè)字節(jié)為8bit。但是在C語言中除了8bit的char之外,還有16bit的short型,32bit的long型(要看具體的編譯器),另外,對(duì)于位數(shù)大于8位的處理器,例如16位或者32位的處理器,由于寄存器寬度大于一個(gè)字節(jié),那么必然存在著一個(gè)如果將多個(gè)字節(jié)安排的問題。因此就導(dǎo)致了大端存儲(chǔ)模式和小端存儲(chǔ)模式.但是,大端小端沒有誰優(yōu)誰劣,各自優(yōu)勢(shì)便是對(duì)方劣勢(shì)
eg.一個(gè)16bit的short型x,在內(nèi)存中的地址為0x0010,x的值為0x1122,那么0x11為高字節(jié),0x22為低字節(jié)。對(duì)于大端模式,就將0x11放在低地址中,即0x0010中,0x22放在高地址中,即0x0011中。而對(duì)于小端模式,恰好相反2.判斷機(jī)器的大小端
#include <stdio.h> /*聯(lián)合*/ union node {int num;char ch; } int main() {union node p;//方法一p.num = 0x12345678;if (p.ch == 0x78){printf("Little endian\n");}else{printf("Big endian\n");}return 0; }- 所以Linux是小端的
3.如何進(jìn)行轉(zhuǎn)換
對(duì)于字?jǐn)?shù)據(jù)(16位)
#define BigtoLittle16(A) (( ((uint16)(A) & 0xff00) >> 8) | \ (( (uint16)(A) & 0x00ff) << 8))對(duì)于雙子數(shù)據(jù)(32位)
#define BigtoLittle32(A) ((( (uint32)(A) & 0xff000000) >> 24) | \ (( (uint32)(A) & 0x00ff0000) >> 8) | \ (( (uint32)(A) & 0x0000ff00) << 8) | \ (( (uint32)(A) & 0x000000ff) << 24))判斷CPU的大小端
int a = 1; if ((char)a == 1) //取最低地址的一個(gè)字節(jié)cout << "小端序" << endl; elsecout << "大端序" << endl;數(shù)據(jù)類型
- 數(shù)據(jù)類型在數(shù)據(jù)結(jié)構(gòu)中的定義是一個(gè)值的集合以及定義在這個(gè)值集上的一組操作。
- 數(shù)據(jù)類型的出現(xiàn)是為了把數(shù)據(jù)分成所需內(nèi)存大小不同的數(shù)據(jù),編程的時(shí)候需要用大數(shù)據(jù)的時(shí)候才需要申請(qǐng)大內(nèi)存,就可以充分利用內(nèi)存。
- 數(shù)據(jù)類型的具體實(shí)現(xiàn)由計(jì)算機(jī)的體系結(jié)構(gòu)決定。
typedef命名數(shù)據(jù)類型
- 用typedef可以聲明各種類型名,但不能用來定義變量,用typedef可以聲明數(shù)組類型、字符串類型、使用比較方便。
- typedef與#define有相似之處,但事實(shí)上二者是不同的,#define是在 預(yù)編譯 時(shí)處理,它只能做簡單的字符串替換,而typedef是在 編譯時(shí) 處理的。
- 用typedef只是對(duì)已經(jīng)存在的類型增加一個(gè)類型名,而沒有創(chuàng)造新的類型。
位操作和邏輯運(yùn)算
模數(shù)運(yùn)算
- 模:是運(yùn)算結(jié)果超出實(shí)際數(shù)據(jù)表示范圍的溢出量,它等于數(shù)的最大值加1.
計(jì)算機(jī)只能進(jìn)行非負(fù)的模數(shù)加法。
eg.50+80=(1)30。
因?yàn)樽珠L限制,運(yùn)算結(jié)果自動(dòng)舍去溢出量,只保留小于模的部分,這種受模限制的運(yùn)算叫模數(shù)運(yùn)算。
c的位級(jí)運(yùn)算
- | 就是OR(或),&就是AND(與),~就是NOT(取反),而^就是EXCLUSIVE-OR(異或)
- 可用于任何整型數(shù)據(jù):unsigned,long long int ,long,int short ,char
c邏輯運(yùn)算
- 邏輯運(yùn)算符:&&、||、!
- 總是返回0或1,是整數(shù)的布爾運(yùn)算,返回0表示“假”,返回1表示“真”。
1、邏輯短路與運(yùn)算
#include <stdio.h> int main() { int a=5,b=6,c=7,d=8,m=2,n=2; (m=a>b)&&(n=c>d); printf("%d\t%d",m,n); return 0; }輸出的結(jié)果為0,2。因?yàn)閍>b為0,m=0,整個(gè)“與”邏輯判斷就為“假”,所以后面的“c>d”就被短路掉了,所以n還是等于原先的2。
2.邏輯運(yùn)算或運(yùn)算
#include <stdio.h> int main() { int a=5,b=6,c=7,d=8,m=2,n=2; (m=a<b)||(n=c>d); printf("%d\t%d",m,n); return 0; }輸出的結(jié)果為1,2。因?yàn)閍<b,m=1,這個(gè)“或”邏輯就被“短路”掉了,后面的語句就沒被執(zhí)行,所以n還是等于原先的2
c移位操作
左移:x<<y
- 向量x向左移y個(gè)位置,丟棄左邊額外的位,右邊用0填充
右移:x>>y
- 向量x向右移動(dòng)y個(gè)位置,丟棄右邊額外的為,左邊用0填充(邏輯右移),復(fù)制最高位用于整數(shù)的補(bǔ)碼表示(算術(shù)右移)
c和java對(duì)右移的規(guī)定
c語標(biāo)準(zhǔn)并沒有明確定義應(yīng)該使用哪種類型的右移。對(duì)于無符號(hào)數(shù)據(jù),右移必須是邏輯的,對(duì)于有符號(hào)數(shù)據(jù),算術(shù)的或者邏輯的右移都可以,實(shí)際上,幾乎所有的編譯器/機(jī)器組合都對(duì)有符號(hào)數(shù)據(jù)使用算術(shù)右移。
- Java有明確的右移定義。表達(dá)式x>>k會(huì)將x算術(shù)右移K個(gè)位置,而x>>>k會(huì)對(duì)x做邏輯右移。
當(dāng)移動(dòng)位數(shù)k大于等于字長w,實(shí)際上位移量就是通過計(jì)算k mod w 得到的。
返回分類
二、整數(shù)表示及運(yùn)算
整數(shù)是現(xiàn)實(shí)世界中使用最多的數(shù),在計(jì)算機(jī)系統(tǒng)中,為整數(shù)定義了很多數(shù)據(jù)類型。
無符號(hào)和補(bǔ)碼編碼
數(shù)字編碼
數(shù)字信息的編碼方式:將數(shù)字x經(jīng)過某種數(shù)學(xué)變換之后得到的另一個(gè)數(shù)字x1作為其編碼,這個(gè)數(shù)字x1常常寫成位向量形式。
- 實(shí)際的應(yīng)用常需要無符號(hào)數(shù)的編碼或有符號(hào)數(shù)的編碼,前者稱為無符號(hào)編碼,后者稱為二進(jìn)制補(bǔ)碼編碼。
- 有符號(hào)編碼變換如下:
C庫
C庫中的頭文件
<limits.h>定義了一組宏,來限定編譯器運(yùn)行的機(jī)器的不同整型和字符型的取值范圍。如它定義常量INT_MAX、INT_MIN和UINT_MAX來描述有符號(hào)和無符號(hào)整數(shù)的范圍。
<float.h>指定浮點(diǎn)型范圍和精度
<stdins.h>定義了一組形如intN_t和uintN_t的數(shù)據(jù)類型,其中N可為8、16、32、64.
eg.1
#include <stdio.h> #include <limits.h> int main(int argc,char* argv[]) { printf("INT_MAX=%d\n",INT_MAX); printf("INT_MIN=%d\n",INT_MIN); printf("UINT_MAX=%u\n",UINT_MAX); return 0; }eg.2
#include <stdio.h> #include <limits.h> #if INT_MAX>=3000000000 typedef int Quantity; #else typedef long long Quantity; #endif int main(int argc,char* argv[]) { printf("int=%d\n",sizeof(int)); printf("long long=%d\n",sizeof(long long)); printf("quantity=%d\n",sizeof(Quantity)); return 0; }有符號(hào)數(shù)和無符號(hào)數(shù)之間的轉(zhuǎn)換
C允許無符號(hào)數(shù)和有符號(hào)數(shù)之間的轉(zhuǎn)換,原則是位表示保持不變。這些轉(zhuǎn)換可以是顯示的或隱式的。
eg
- 當(dāng)用printf輸出一個(gè)整數(shù)時(shí),按照整數(shù)的編碼根據(jù)不同的指示符分別輸出int類型(%d)、unsigned類型(%u)或十六進(jìn)制格式(%x)
對(duì)于大多數(shù)C語言實(shí)現(xiàn),處理同樣位長的有符號(hào)數(shù)(補(bǔ)碼)和無符號(hào)數(shù)間轉(zhuǎn)換規(guī)則是:位模式不變,改變解釋這些位的方式
什么時(shí)候使用無符號(hào)類型 - 盡量不要在代碼中使用無符號(hào)數(shù)類型,以免增加不必要的復(fù)雜性。
- 僅當(dāng)需要對(duì)二進(jìn)制位進(jìn)行操作的時(shí)候,才使用無符號(hào)數(shù)。
- 在表示內(nèi)存地址、實(shí)現(xiàn)模運(yùn)算和多精度運(yùn)算的數(shù)學(xué)包時(shí),也可使用無符號(hào)數(shù)。
整數(shù)加法
無符號(hào)加法
①操作數(shù):w bits → w+1 bits
②精確值:w+1 bits
③截?cái)嘀?#xff1a;w bits
運(yùn)算法則:為了不丟失精度,x、y的編碼應(yīng)零擴(kuò)展為w+1位無符號(hào)數(shù)編碼
無符號(hào)減法
通過模數(shù)加法來實(shí)現(xiàn)
在無符號(hào)減法中,減去一個(gè)無符號(hào)數(shù),相當(dāng)于加上它的加法逆元。無符號(hào)數(shù)的加法逆元都為正數(shù)。
有符號(hào)數(shù)加法
①操作數(shù):w bits → w+1 bits
②精確值:w+1 bits
③截?cái)嘀?#xff1a;w bits
運(yùn)算法則:為了不丟失精度,x、y的編碼應(yīng)符號(hào)擴(kuò)展為w+1位二進(jìn)制編碼
有符號(hào)減法
通常轉(zhuǎn)換為有符號(hào)加法來實(shí)現(xiàn)
在有符號(hào)減法中,減去一個(gè)有符號(hào)數(shù),相當(dāng)于加上它的加法逆元。有符號(hào)數(shù)的加法逆元是它的相反數(shù)。
整數(shù)乘法
- 計(jì)算w位數(shù)字x、y的實(shí)際乘積
返回分類
三、浮點(diǎn)數(shù)
浮點(diǎn)數(shù)是屬于有理數(shù)中某特定子集的數(shù)的數(shù)字表示,在計(jì)算機(jī)中用以近似表示任意某個(gè)實(shí)數(shù)。具體的說,這個(gè)實(shí)數(shù)由一個(gè)整數(shù)或定點(diǎn)數(shù)(即尾數(shù))乘以某個(gè)基數(shù)(計(jì)算機(jī)中通常是2)的整數(shù)次冪得到,這種表示方法類似于基數(shù)為10的科學(xué)計(jì)數(shù)法。
IEEE浮點(diǎn)標(biāo)準(zhǔn)
浮點(diǎn)的引入
- 使用整數(shù)的編碼可以表示以0為中心的一定范圍內(nèi)的正負(fù)整數(shù),但缺陷為:
①無法表示那些絕對(duì)值“很大的”數(shù)值
②除了整數(shù)以外,在很多場合還需使用絕對(duì)值“極小的”小數(shù),由于小數(shù)的某些特點(diǎn),不能使用表示整數(shù)的方式去表示小數(shù)。
浮點(diǎn)數(shù)和IEEE754
科學(xué)記數(shù)法表示二進(jìn)制數(shù):
-1^s*2^E*Ms是符號(hào)位;2是基數(shù),E是指數(shù),
2^E構(gòu)成一個(gè)冪,表示數(shù)量級(jí)范圍;M是有效數(shù)字部分(尾數(shù)),主要表示數(shù)值精度。M的位數(shù)越多,有效數(shù)字越多,數(shù)值精度越高。
IEEE754浮點(diǎn)標(biāo)準(zhǔn)
- IEEE754中,指定長度的浮點(diǎn)實(shí)數(shù)格式只有兩種:float(單精度浮點(diǎn)實(shí)數(shù))和double(雙精度浮點(diǎn)實(shí)數(shù)),float的長度固定為4字節(jié),double的長度固定為8字節(jié)。
s=0或1,表示正或負(fù)值,用1bit編碼S
E=e-bias。
M=1+f或f,0≤f<1。M應(yīng)取哪個(gè)值依賴于e是否等于0.
規(guī)格化值:當(dāng)exp編碼不全為0,不全為1,可得到浮點(diǎn)數(shù)編碼的規(guī)格化值
非規(guī)格化值:exp編碼全為0時(shí),可得到浮點(diǎn)數(shù)編碼的非規(guī)格化值
特殊值:exp編碼全為1,可得到浮點(diǎn)數(shù)編碼的特殊值
eg.
1.采用IEEE單精度格式,試求出32位浮點(diǎn)編碼0xAC710000的值。
解:1,01011000,11100010000000000000000
s=[1],為負(fù)數(shù)
exp=[01011000],E=88-127=-39
frac=[1110001]
M=1+(0.1110001)b=1+141/16+21/256=1+0.875+0.0078125=1.8828125
2.試寫出數(shù)0.8125的IEEE單精度浮點(diǎn)數(shù)編碼
解:
該數(shù)為正,s=0;E=-1=126-127,exp=126=[01111110]
尾數(shù)frac=[10100000000000000000000]
- 浮點(diǎn)編碼:[0 01111110 10100000000000000000000]=0x3F500000
舍入
- 由于浮點(diǎn)表示方法只是離散地表示了實(shí)數(shù),所以相應(yīng)的浮點(diǎn)運(yùn)算只能是近似的實(shí)數(shù)運(yùn)算。
- 對(duì)于值x,我們一般想有一種系統(tǒng)的方法,能夠找到“最接近的”,用x’的浮點(diǎn)形式來表示x,這就是舍入的任務(wù)。
浮點(diǎn)運(yùn)算
C浮點(diǎn)類型
C提供了2種浮點(diǎn)類型:float和double。
int、float、double之間的強(qiáng)制類型轉(zhuǎn)換。
為什么int到float,為什么可能被舍入
float有23位用來表示有效數(shù)字,對(duì)于整數(shù)來說,超過2^23之后,很多數(shù)字都沒法精確表示了,比如2^23+1。
如果把2^23+1這個(gè)int轉(zhuǎn)化位float,就只能轉(zhuǎn)換成最接近的2^23。
返回分類
習(xí)題
2.60
#include <stdio.h> #include <assert.h>unsigned replace_byte(unsigned x, int i, unsigned char b) {if (i < 0) {printf("error: i is negetive\n");return x;}if (i > sizeof(unsigned)-1) {printf("error: too big i");return x;}unsigned mask = ((unsigned) 0xFF) << (i << 3);unsigned pos_byte = ((unsigned) b) << (i << 3);return (x & ~mask) | pos_byte; }int main(int argc, char *argv[]) {unsigned rep_0 = replace_byte(0x12345678, 0, 0xAB);unsigned rep_3 = replace_byte(0x12345678, 3, 0xAB);assert(rep_0 == 0x123456AB);assert(rep_3 == 0xAB345678);return 0; }代碼托管
上周考試錯(cuò)題總結(jié)
1.給定32位虛給定32位虛擬地址空間和24位的物理地址,頁面大小為8K,下面說法正確的是()
A .
VPN=13
B .
VPN=19
C .
PPO=13
D .
VPO=11
E .
PPN=11
正確答案: B C E
結(jié)對(duì)及互評(píng)
點(diǎn)評(píng)模板:
- 博客中值得學(xué)習(xí)的或問題: - - 代碼中值得學(xué)習(xí)的或問題: -本周結(jié)對(duì)學(xué)習(xí)情況
- [20155225](http://www.cnblogs.com/clever-universe/p/8052696.html) - 結(jié)對(duì)照片 - 結(jié)對(duì)學(xué)習(xí)內(nèi)容- 相互講解第二章和第五章的內(nèi)容其他(感悟、思考等,可選)
在此學(xué)習(xí)第二章,相比于開學(xué)那一次學(xué)習(xí)有更多的收獲與見解。
學(xué)習(xí)進(jìn)度條
| 目標(biāo) | 5000行 | 15篇 | 400小時(shí) | |
| 第一周 | 20/20 | 1/ | 12/12 | |
| 第二周 | 42/62 | 1/2 | 8/20 | |
| 第三周 | 62/124 | 1/3 | 14/34 | |
| 第四周 | 61/185 | 1/4 | 10/44 | |
| 第五周 | / | 2/6 | 13/57 | |
| 第六周 | / | 2/8 | 17/74 | |
| 第七周 | / | 2/10 | 15/89 | |
| 第八周 | / | 2/12 | 12/101 | |
| 第九周 | / | 2/14 | 10/111 | |
| 第十一周 | / | 1/16 | 12/123 | |
| 第十三周 | / | 2/18 | 17/140 | 學(xué)習(xí)認(rèn)為最重要的一章 |
嘗試一下記錄「計(jì)劃學(xué)習(xí)時(shí)間」和「實(shí)際學(xué)習(xí)時(shí)間」,到期末看看能不能改進(jìn)自己的計(jì)劃能力。這個(gè)工作學(xué)習(xí)中很重要,也很有用。
耗時(shí)估計(jì)的公式
:Y=X+X/N ,Y=X-X/N,訓(xùn)練次數(shù)多了,X、Y就接近了。
參考:軟件工程軟件的估計(jì)為什么這么難,軟件工程 估計(jì)方法
計(jì)劃學(xué)習(xí)時(shí)間:18小時(shí)
實(shí)際學(xué)習(xí)時(shí)間:18小時(shí)
改進(jìn)情況:本周是學(xué)習(xí)認(rèn)為最重要的一章,雖然是重新學(xué)一遍,有了第一遍的基礎(chǔ),但還是在一些問題上更深的去探討了
(有空多看看現(xiàn)代軟件工程 課件
軟件工程師能力自我評(píng)價(jià)表)
參考資料
- 《深入理解計(jì)算機(jī)系統(tǒng)V3》學(xué)習(xí)指導(dǎo)
- C語言中int到float的強(qiáng)制類型轉(zhuǎn)換
轉(zhuǎn)載于:https://www.cnblogs.com/fyhtvxq/p/8053428.html
總結(jié)
以上是生活随笔為你收集整理的2017-2018-1 20155229 《信息安全系统设计基础》第十三周学习总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mysql分组获取其他字段_sqlser
- 下一篇: cocos 禁掉快速点击_win10系统