計算機系統導論——讀書筆記——第二章 信息的表示和處理

第二章 信息的表示和處理

2.1 信息存儲

2.1.1 十六進制

2.1.2 字數據大小

2.1.3 尋址和字節順序

1.地址:對象所使用的字節中最小的地址git

2.大端法:最高有效字節在前github

  小端法:最低有效字節在前(大多Intel兼容機使用)小程序

3.發送方機器(內部代碼)——>網絡應用程序(網絡標準)——>接收方機器(內部代碼)windows

4.小程序——打印程序對象的字節表示xcode

 1 #include <stdio.h>  2 using namespace std;  3  4 typedef unsigned char * byte_pointer;//定義類型:指向unsigned char的指針  5  6 void show_byte(byte_pointer start, size_t len){  7  size_t i;  8 for(i = 0; i < len; ++i)  9 printf(" %.2x", start[i]);//%.2x表示整數必須用至少兩個數字的十六進制格式輸出 10 printf("\n"); 11 } 12 13 void show_int(int x){ 14 show_byte((byte_pointer) &x, sizeof(int)); 15 } 16 17 void show_float(float x){ 18 show_byte((byte_pointer) &x, sizeof(float)); 19 } 20 21 void show_double(double x){ 22 show_byte((byte_pointer) &x, sizeof(double)); 23 } 24 25 void show_pointer(void * x){//void*是特殊類型的指針,沒有相關聯的類型信息 26 show_byte((byte_pointer) &x, sizeof(void *)); 27 } 28 29 int main(){ 30 int x; 31 float y; 32 double z; 33 while(scanf("%d %f %lf", &x, &y, &z)){ 34  show_int(x); 35  show_float(y); 36  show_double(z); 37 show_pointer(&x); 38 show_pointer(&y); 39 show_pointer(&z); 40  } 41 return 0; 42 }

輸入網絡

1 1 1 -1 -1.0 -1.0 12345 1.001 1.001

輸出app

 01 00 00 00 00 00 80 3f 00 00 00 00 00 00 f0 3f 98 f5 bf ef fe 7f 00 00 94 f5 bf ef fe 7f 00 00 88 f5 bf ef fe 7f 00 00 ff ff ff ff 00 00 80 bf 00 00 00 00 00 00 f0 bf 98 f5 bf ef fe 7f 00 00 94 f5 bf ef fe 7f 00 00 88 f5 bf ef fe 7f 00 00 39 30 00 00 c5 20 80 3f 6a bc 74 93 18 04 f0 3f 98 f5 bf ef fe 7f 00 00 94 f5 bf ef fe 7f 00 00 88 f5 bf ef fe 7f 00 00 

 個人電腦是MaxOS,能夠看出它是64位系統,採用小端法表示函數

 5.能夠經過在終端(mac是terminal,windows是命令行工具)執行命令man ascii獲得一張ASCII字符碼錶,回車後運行結果以下工具

ASCII(7) BSD Miscellaneous Information Manual ASCII(7) NAME ascii -- octal, hexadecimal and decimal ASCII character sets DESCRIPTION The octal set: 000 nul 001 soh 002 stx 003 etx 004 eot 005 enq 006 ack 007 bel 010 bs 011 ht 012 nl 013 vt 014 np 015 cr 016 so 017 si 020 dle 021 dc1 022 dc2 023 dc3 024 dc4 025 nak 026 syn 027 etb 030 can 031 em 032 sub 033 esc 034 fs 035 gs 036 rs 037 us 040 sp 041 ! 042 " 043 # 044 $ 045 % 046 & 047 ' 050 ( 051 ) 052 * 053 + 054 , 055 - 056 . 057 / 060 0 061 1 062 2 063 3 064 4 065 5 066 6 067 7 070 8 071 9 072 : 073 ; 074 < 075 = 076 > 077 ? 100 @ 101 A 102 B 103 C 104 D 105 E 106 F 107 G 110 H 111 I 112 J 113 K 114 L 115 M 116 N 117 O 120 P 121 Q 122 R 123 S 124 T 125 U 126 V 127 W 130 X 131 Y 132 Z 133 [ 134 \ 135 ] 136 ^ 137 _ 140 ` 141 a 142 b 143 c 144 d 145 e 146 f 147 g 150 h 151 i 152 j 153 k 154 l 155 m 156 n 157 o 160 p 161 q 162 r 163 s 164 t 165 u 166 v 167 w 170 x 171 y 172 z 173 { 174 | 175 } 176 ~ 177 del The hexadecimal set: 00 nul 01 soh 02 stx 03 etx 04 eot 05 enq 06 ack 07 bel 08 bs 09 ht 0a nl 0b vt 0c np 0d cr 0e so 0f si 10 dle 11 dc1 12 dc2 13 dc3 14 dc4 15 nak 16 syn 17 etb 18 can 19 em 1a sub 1b esc 1c fs 1d gs 1e rs 1f us 20 sp 21 ! 22 " 23 # 24 $ 25 % 26 & 27 ' 28 ( 29 ) 2a * 2b + 2c , 2d - 2e . 2f / 30 0 31 1 32 2 33 3 34 4 35 5 36 6 37 7 38 8 39 9 3a : 3b ; 3c < 3d = 3e > 3f ? 40 @ 41 A 42 B 43 C 44 D 45 E 46 F 47 G 48 H 49 I 4a J 4b K 4c L 4d M 4e N 4f O 50 P 51 Q 52 R 53 S 54 T 55 U 56 V 57 W 58 X 59 Y 5a Z 5b [ 5c \ 5d ] 5e ^ 5f _ 60 ` 61 a 62 b 63 c 64 d 65 e 66 f 67 g 68 h 69 i 6a j 6b k 6c l 6d m 6e n 6f o 70 p 71 q 72 r 73 s 74 t 75 u 76 v 77 w 78 x 79 y 7a z 7b { 7c | 7d } 7e ~ 7f del The decimal set: 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del FILES /usr/share/misc/ascii HISTORY An ascii manual page appeared in Version 7 AT&T UNIX. BSD June 5, 1993 BSD (END)

2.1.4 表示字符串

1.十進制數字‘y’的ascii碼正好是0x3y性能

2.strlen(str)函數不計算終止的空字符(ascii碼爲0x00)

3.字符編碼方式:

(1)ASCII (American Standard Code for Information interchange)

(2)Unicode (Unique Code)

(3)UTF-8 / UTF-16 / UFT-32 (Unicode Transformation Format)

詳見文章:https://knightyun.github.io/2019/01/27/ascii-unicode

2.1.5 表示代碼

2.1.6 布爾代數(Boolean Algebra)簡介

1.布爾運算&對|有分配律:a&(b|c) = (a&b)|(a&c)

  布爾運算|對&有分配律:a|(b&c) = (a|b)&(a|c)

2.位向量:長度爲w,由0和1組成的串

  應用:表示有限集合/壓位運算(例:[01101010]表示集合{1,3,5,6}),位向量掩碼/屏蔽信號

3.布爾環(Boolean ring),相似於整環/整數環

  「加法」逆元:^相似於+; 每一個整數x有加法逆元-x使得x+(-x)=0,相似地,每一個布爾元素a都有「加法逆元」a使得a^a=0; 有趣的性質:(a^b)^a=b

1 //這是一個不須要第三個量的交換函數,不過它並無性能上的優點 2 void inplace_swap(int *x, int *y){//*x = a, *y = b 3 *x = *x ^ *y;//*x = a^b, *y = b 4 *y = *x ^ *y;//*x = a^b, *y = a 5 *x = *x ^ *y;//*x = b, *y = a 6 }

2.1.7 C語言中的位級運算:&, |, ^, ~

2.1.8 C語言中的邏輯運算: &&, ||, !

2.1.9 C語言中的移位運算:>>, <<

1.邏輯右移(高位補0,無符號數進行邏輯右移)

  算數右移(高位補符號位,有符號數進行算數右移)

2.運算符優先級:見https://blog.csdn.net/changexhao/article/details/82556761

  (1)初級運算符[]().->

  (2)單目運算符

  (3)算數運算符

  (4)移位運算符

  (5)關係運算符

  (6)位級運算符

  (7)邏輯運算符

  (8)賦值運算符

 

 

2.2 整數表示

2.2.1 整形數據類型

2.2.2 無符號數的編碼(unsigned)

2.2.3 補碼編碼(two's-complement)

1.<limits.h>庫:INT_MIN, INT_MAX, UINT_MAX

  <stdint.h>庫:intN_t, UintN_t (t = 16,32,64等)

 (我在xcode上沒有include這兩個庫也能直接使用INT_MIN、int32_t等)

2.有符號數的表示方法

  (1)補碼(two's-complement):最高位權重爲-2^(w-1)

  (2)反碼(ones' complement):最高位權重爲-(2^(w-1)-1)

  (3)原碼(sign-magnitude):最高位爲1表示全部其餘位權重爲負

  注:(2)(3)中0的表示法不惟一,有+0和-0兩種

2.2.4 有符號數和無符號數之間的轉換

(可能)改變數值,但不改變位表示

1.補碼轉換爲無符號數(w位):

  TMin <= x < 0,  T2U(x) = x + 2^w

  0 <= x <= TMax, T2U(x) = x 

2.無符號數轉換爲有符號數(w位):

  0 <= x <= TMax,   U2T(x) = x

  TMax < x <= UMax, U2T(x) = x - 2^w

2.2.5 C語言中的有符號數和無符號數

1.數字常量默認爲有符號數,加上後綴u或U可建立無符號數常量

2.類型轉換的方式:

  (1)顯式:強制類型轉換

  (2)隱式:不一樣類型變量間賦值

3.%d有符號十進制,%u無符號十進制,%o八進制,%x十六進制

4.C語言對於同時包含有符號數和無符號數的表達式,會隱式地將有符號數轉換爲非負的無符號數

 1 /*  2  這是一個測試函數  3  注:TMin寫成-2147483647-1而非-2147483648  4  是由於limits.h中定義INT_MIN=-INT_MAX-1,以規避某些奇怪的現象  5 */  6 #include <cstdio>  7 using namespace std;  8  9 int main(){ 10 printf("-1 < 0u = %d\n", -1 < 0u); 11 printf(" -1 = 0x%x \n", -1); 12 printf(" 0u = 0x%x\n\n", 0u); 13 14 printf("2147483547 > (int)2147483648u = %d\n", 2147483547 > (int)2147483648u); 15 printf(" 2147483547 = 0x%x \n", 2147483547); 16 printf(" (int)2147483648u = 0x%x\n\n", (int)2147483648u); 17 18 printf("-2147483647-1u < 2147483647 = %d\n", -2147483647-1u < 2147483647); 19 printf(" -2147483647-1u = 0x%x \n", -2147483647-1u); 20 printf(" 2147483647 = 0x%x\n\n", 2147483647); 21 22 printf("-2147483647-1u < -2147483647 = %d\n", -2147483647-1u < -2147483647); 23 printf(" -2147483647-1u = 0x%x \n", -2147483647-1u); 24 printf(" -2147483647 = 0x%x\n\n", -2147483647); 25 return 0; 26 }

運行結果以下

-1 < 0u = 0 -1 = 0xffffffff 0u = 0x0 2147483547 > (int)2147483648u = 1 2147483547 = 0x7fffff9b (int)2147483648u = 0x80000000 -2147483647-1u < 2147483647 = 0 -2147483647-1u = 0x80000000 2147483647 = 0x7fffffff -2147483647-1u < -2147483647 = 1 -2147483647-1u = 0x80000000 -2147483647 = 0x80000001 

 

2.4 浮點數

2.4.1 二進制小數

 

2.4.2 IEEE浮點表示

1.表示形式:

 

 (1)符號(sign)s: 表示+-

 (2)尾數(significand)M:二進制小數,取值範圍爲[1,2)或[0,1)

 (3)階碼(exponent)E:對浮點數加權,權重爲2的E次冪

2.編碼:

 

       s編碼符號sign s,exp編碼階碼exponent E,frac編碼尾數significand M

      

3.三種狀況

 (1)規格化的(noemalized): exp!=00...0 && exp!=11...1 

    i.  階碼 E = exp - bias, bias = 2^(k-1)-1, k=exp的位數

    ii. 尾數 M = 1.xx...x = 1.frac的位(隱含的以1開頭的表示)

 (2)非規格化的(denormalized): exp == 00...0

    i.  階碼 E = 1 - bias, bias = 2^(k-1)-1, k=exp的位數

    ii. 尾數 M = 0.xx...x = 0.frac的位

    iii.注意:0.0有兩種表示方法+0.0和-0.0,符號位分別爲0或1,其餘位所有爲0

 (3)特殊值: exp == 11...1

    i.  無窮:frac = 00...0, s=0或1表示+∞或-∞,可以表示溢出的運算結果,如x/0

    ii. Nan(not a number): frac != 00...0, 表示非實數的運算結果,如根號-1,∞-∞

4.三種狀況的數字分佈

非規格化數字的階碼定義爲E=1-bias能夠補償非規格化的尾數沒有隱含的開頭1,有助於數字表示的平滑轉變;不然,在絕對值最大的非規格化數字(其二進制表示爲0 00...0 11...1)和絕對值最小的規格化數字(其二進制表示爲0 00...01 00...0)之間將存在跳躍

2.4.3 數字示例

1. 處理正浮點數時,若按照無符號整數解釋他們的二進制表示,則能夠發現它們的大小順序不變;負浮點數只須要倒序

相關文章
相關標籤/搜索