计算机系统导论——读书笔记——第⼆章信息的表⽰和处理第⼆章信息的表⽰和处理
2.1 信息存储
2.1.1 ⼗六进制
2.1.2 字数据⼤⼩
2.1.3 寻址和字节顺序
1.地址:对象所使⽤的字节中最⼩的地址
2.⼤端法:最⾼有效字节在前
⼩端法:最低有效字节在前(⼤多Intel兼容机使⽤)
3.发送⽅机器(内部代码)——>⽹络应⽤程序(⽹络标准)——>接收⽅机器(内部代码)
4.⼩程序——打印程序对象的字节表⽰
1 #include <stdio.h>
2using namespace std;
3
4 typedef unsigned char * byte_pointer;//定义类型:指向unsigned char的指针
5
6void show_byte(byte_pointer start, size_t len){
7    size_t i;
8for(i = 0; i < len; ++i)
9        printf(" %.2x", start[i]);//%.2x表⽰整数必须⽤⾄少两个数字的⼗六进制格式输出
10    printf("\n");
11 }
12
13void show_int(int x){
14    show_byte((byte_pointer) &x, sizeof(int));
15 }
16
17void show_float(float x){
18    show_byte((byte_pointer) &x, sizeof(float));
19 }
20
21void show_double(double x){
22    show_byte((byte_pointer) &x, sizeof(double));
23 }
24
25void show_pointer(void * x){//void*是特殊类型的指针,没有相关联的类型信息
26    show_byte((byte_pointer) &x, sizeof(void *));
27 }
28
29int main(){
30int x;
31float y;
32double z;
33while(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    }
41return0;
42 }
输⼊
1
1
1
-1
-1.0
-1.0
12345
1.001
1.001
输出
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)
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//这是⼀个不需要第三个量的交换函数,不过它并没有性能上的优势
2void 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,⽆符号数进⾏逻辑右移)
算数右移(⾼位补符号位,有符号数进⾏算数右移)
(1)初级运算符[]().->
(2)单⽬运算符
(3)算数运算符
(4)移位运算符
(5)关系运算符
(6)位级运算符
(7)逻辑运算符
(8)赋值运算符
2.2 整数表⽰
2.2.1 整形数据类型
2.2.2 ⽆符号数的编码(unsigned)
2.2.3 补码编码(two's-complement)sizeof 指针
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>
7using namespace std;
8
9int 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);
25return0;
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 ⼆进制⼩数

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。