【字符编码】
在计算机系统中,所有的数据都经过编码进行处理。在计算机中有多种编码方式,最常见的有:
1、无符号编码: 基于二进制的编码,表示大于0或者等于0的数字
2、二进制补码:表示有符号整数的最常见形式。 可以表示负数、0、正数
3、浮点数编码:以2为基的表示实数的科学计数法;
浮点数的可以这么认为: 尾数*2^幂; 通过这个表达式我们可以基本看到浮点数在计算机中的存储模式。
例如:在C语言中float型实数,
Bit15.....bit9 bit8......bit0
bit15-bit9可以用来表示尾数,而Bit8....Bit0则可以表示2的幂次,然后通过系统换算就可以将这样表示的
浮点数换算成十进制的浮点数, 【Float x】bin——>【Float x】dec
【编码的属性】
设计一种编码系统必须要实现各种属性:
1、表示的值域
2、算数运算的属性,或者说可以实施的操作
3、系统中的位级的表示,也就是存储模式
【进制】
常见的有二进制、十进制、八进制、十六进制;日常生活中多用十进制,计算机系统多用二进制和十六进制。
【字】
在计算机系统中,用字长表示整数和指针的标称大小;通常全字长与数据总线和地址总线有关。
字长为n的计算机可以访问的地址空间为0——2^n-1,程序最多可以访问2^n字节。
注:
我记得在学习微机原理的时候,里面说到字长的概念,如下所示:
书名:微型计算机原理与接口技术(第三版)周荷琴 中国科学技术大学出版社
而我看《深入理解计算机系统》则是这么说的:
书名:《计算机_深入理解计算机系统].(美)Randal.E.Bryant&Davic.O.Hallaron.扫描版》
这个地方就让我迷惑了,因为这两个概念风马牛不相及,那么我们该怎么看呢?
直接看上下文吧。
【数据类型大小】
short int: 一般系统两个字节
int:一般是四字节,
long int:一般取全字长,也就是说sizeof(long int)一般是与表示系统地址线的宽度相同;这个也与OS的设计或者编译器的设计有关
float:一般是四个字节
double:一般是八个字节,双精度
char *:全字长
C标准对各个数据类型的下界做了规定,但是没有对上界做规定;一般要求int的范围不比short int小,long int不比int范围小。
【寻址和字节顺序】
对于程序里访问的对象,我们需要关注的有:存储对象的地址、多字节对象的字节顺序以及存储的内容;单字节一般关注存储地址和存储的内容即可;
例如对于char型数据对象,我们一般关注数据对象的地址和内容即可,不需要关注对象字节的存储方式。
多字节对象一般按照下面方式处理:存储为连续的字节序列, 多字节中对应的最小地址为对象的地址。
例如我们有int(32位)型数据对象:
int nTest;
则nTest占用4个字节,如下图:
数据对象nTest占用连续的字节0x100、0x101、0x103、0x104,且其地址为0x100.
说到这个地方我们不能不说的一个计算机中基本的概念:小端和大端。
假设我们有一个占用W位的对象,用二进制表示为【Xw-1,Xw-2,Xw-3.......X3,X2,X1,X0】,W为八的倍数,那么在存储的过程中,这些位就
被分成字节组,每8位为一组,【Xw-1,Xw-2,Xw-3......Xw-8】为最高有效的8位MSB,而【X7.....X2,X1】为最低有效的8位LSB,由于计算机的
存储基本单元室字节(8位),这样存储MSB、LSB等其他位就会有一个前后顺序,可能有两种可能。如下图所示:
小端:用十六进制表示时,权值大的部分放在地址的高端部分,就是如上图的方式2
大端:用十六进制表示时,权值大的部分放在地址的低端部分,如上图的方式1;大端表示法与自然数字表示相同,即数字在计算机中的存储按照
习惯书写方式的方向存储。
大端和小端一般不影响程序的读写和显示,但是在字节块通信的时候,会影响发送和接受方解释数值的大小;同时当使用强制类型转换后的字节
的读取。
例如:0xFBCA_13B4
其小端存储模式存储形式为: B4 13 CA FB
大端存储模式存储形式为: FB CA 13 B4
目前大多数的IBM、Motorola和Sun Microsystem采用的是大端存储法,而Intel的以及PC兼容微机采用的小端法;而且有些计算机可以工作
在大端和小端,具体工作在什么模式则取决于系统加电时规定的存储规则。
【字符串】
在C语言标准中字符串是连续字符序列,并且字符序列的最后是空字符'\0',字符串的长度不包括最后的控制符'\0';在很多时候用null表示'\0';
为了这样表示可以定义一个宏:
#define null ('\0') //这里需要注意NULL和null具有不同的性质,虽然在数值上是相等的
特别地定义:
#define NULL ((void *)0) //这里0具有指针的特性
字符串从技术上可以看作是字符数组,其在计算机中是连续存储的,存储区域的最低地址存储的是字符串的首字符。
最常见的字符编码方式是ASCII编码方式。
Tip: 十进制的0、1、2......9,正好对应十六进制的编码的0x30、0x31.....0x39; 即数字0的ASCII码值为(48)dec。
字符串用双引号引用,例如:字符串"abc"、空字符串"";
字符串支持连接,例如: "abcdefg""hijk" 则表示字符串"abcdefghijk"
字符串本身返回其存储首地址;例如char* strTest="abc"; 则我们可以利用strTest引用字符内的字符以及字符串。
---恢复内容结束---