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; }
结果:
明天再分析、。。。。。。