Chapter two 資訊的表示和儲存
1、二值訊號是在通訊和計算等方面更容易表示、儲存和傳輸
2、三種重要的數字編碼:無符號/二進位補碼(有符號)/浮點數編碼
3、電腦對於有限位元字編碼來說,結果太大會導致overflow
2.1 資訊儲存
1、computer最小儲存單位byte.每個byte 包括8位,機器級程式程式經常在二、十、十六進位之間轉換。
轉換規則。
轉換竅門:記16進位ACF對應的10進位值,可以方便轉換16進位和2進位
而2進位與10進位之間的關係主要是通過mod:
10轉2:
eg. 55變二進位110111
55/2==27......1
27/2==13......1
13/2==6.......1
6/2==3........0
3/2==1........1
1/2==0........1
倒序list 110111
2轉10:
Eg. 110111變55
55=2^0+2^1+2^2+2^4+2^5
=1+2+4+16+32
其實也可以這樣記:2^0 2^1 2^2 2^3 2^4 2^5 2^6 2^7
1 2 4 8 16 32 64 128
以後10進位轉2進位就可以用這個表來“湊”數了。
16進位與10進位的轉換類似10進位與2進位。mod
因為無法通過格式化的方法直接在一般的編譯器中實現10進位數字2進位輸出的形式。用C語言按位與可以實現。當然用mod方法也可以。
按位與的特點是,是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1,否則為0
#include <stdio.h>int main(void){const int iTimes=sizeof(int) * 8;int iMask=1;int x = 12345; //這個就是要轉換的數int x2[iTimes];int i;for( i=0 ; i<iTimes ; i++ ){x2[i]=x & iMask;iMask = iMask << 1; //printf("%d\n",iMask);}printf("\n(%d)d=",x);for( i=iTimes -1 ; i >=0 ; i-- ){printf("%d",x2[i] ? 1 : 0 );}return 0;}
結果:
2、
大端法:機器按照從最高有效位元組到最低有效位元組的順序儲存
小端法:機器按照從最低有效位元組到最高有效位元組的順序儲存
例:在字ox01234567中,高位元組的十六進位值為OX01,低位位元組值OX67
位元組的儲存順序最終取決於機器本身。大多數情況下不用考慮這些的。
但是當遇到大小端機器互傳資料、檢查機器級程式、編寫規避正常類型系統的程式時才會用到大小端。。。。。
下面是規避正常類型系統程式碼:
#include <iostream>#include<stdio.h>#include<string.h>using namespace std;void show_bytes(char * start,int len){ int i; for(i=0;i<len;i++) { printf("%.2x",start[i]); } printf("\n");}void show_int(int x){ show_bytes((char *)&x,sizeof(int));}void show_float(float x){ show_bytes((char *)&x,sizeof(float));}void show_pointer(void *x){ show_bytes((char*)&x,sizeof(void *));}int main(){ //char *a; //cin>>a; //int k=strlen(a); show_bytes("abc",3); cout<<endl<<endl; show_int(65); cout<<endl<<endl; show_float(65); //show_pointer(); return 0;}
結果:
明天再分析、。。。。。。