目录
2.1.3字节顺序(了解性知识,在网络编程会用到一般可以忽视)
2.1信息存储
2.1.1十六进制表示法`
十六进制表示法是使用0~9和A~F来表示的其中A表示10,B表示11,C表示12以此类推详细的转换情况如下表:
十进制 | 十六进制 | 二进制 | 十进制 | 十六进制 | 二进制 |
0 | 0 | 0 | 8 | 8 | 1000 |
1 | 1 | 1 | 9 | 9 | 1001 |
2 | 2 | 10 | 10 | A | 1010 |
3 | 3 | 11 | 11 | B | 1011 |
4 | 4 | 100 | 12 | C | 1100 |
5 | 5 | 101 | 13 | D | 1101 |
6 | 6 | 110 | 14 | E | 1110 |
7 | 7 | 111 | 15 | F | 1111 |
2.1.2字数据大小
一个字节有8位,一个字根据CPU的字长来决定如果是32位一个字就是4字如果是64位就是8字节。
一个指针所占存储空间的大小就是一个字。
对于程序也有32位和64位之分主要却别是其各数据类型所占的大小略有不同,以C语言基本数据类型为例如下表:
C声明 | 字节数 | |||
有符号 | 无符号 | 32位 | 64位 | |
[signed] char | unsigned char | 1 | 1 | |
short | unsigned short | 2 | 2 | |
int | unsigned int | 4 | 4 | |
long | unsigned long | 4 | 8 | |
int32_t | uint32_t | 4 | 4 | |
int64_t | uint64_t | 8 | 8 | |
char* | 4 | 8 | ||
float | 4 | 4 | ||
double | 8 | 8 |
2.1.3字节顺序(了解性知识,在网络编程会用到一般可以忽视)
对于字节顺序有两种规则一种是小端法即最低有效字节在最前面,另一种是大端法即最高有效字节在最前面这里以0x01234567为例:
大端法:
...... | 0x100 | 0x101 | 0x102 | 0x103 | ...... |
...... | 01 | 23 | 45 | 67 | ...... |
小端法:
........ | 0x100 | 0x101 | 0x102 | 0x103 | ........ |
....... | 67 | 45 | 23 | 01 | ....... |
大多数使用Intel的CPU的计算机只用小端模式。另一方面IBM和Oracle的大多数计算机则是按大端模式操作。不过现在基本上只有Intel和AMD两个CPU生产厂商因此基本上都是采用小端法来进行操作,不过比较新的微处理器是双端法但是实际情况是真正运作时也只能运行其中一种大多数也只是采用小端法进行操作寻址。
2.1.4布尔代数
布尔代数就是常见的各种逻辑运算符和对应的算子的操作其中0表示false,1表示true(实际上除0以为的所有数都为true)这里以C语言位例来表示:
双目运算符 | |||
运算符 | 0 0 | 0 1 | 1 1 |
& | 0 | 0 | 1 |
| | 0 | 1 | 1 |
&& | 0 | 0 | 1 |
|| | 1 | 1 | 1 |
^ | 0 | 1 | 0 |
运算符 | 0x00 | 0x10 | 0 | 1 |
! | 不能使用 | 不能使用 | 1 | 0 |
~ | 0xff | 0xef | 1 | 0 |
&运算就是有0得0可以进行位运算
|运算就是有1得1可以进行位运算应用的比较多一般都是用来合并多个权限的。
^运算是相同位0不同为1可以进行位运算其结果按照运算结果来判定&和|也是如此而不是只有0和1两种结果搞嵌入式硬件用的比较多。
2.1.5位移运算符
位移运算符有两个一个是左移运算发<<一个是右移运算符>>,左移运算符相当于乘2的次方,右移运算符相当于除2的次方。
以x为例x的值为0x10结果如下表(这里都为算术移动):
操作 | 结果 |
x<<4 | 0x100 |
x>>4 | 0x01 |
下面介绍一下逻辑移动对于左移逻辑和算术结果相同所以就没必要列举所以着重讲解右移的逻辑右移。
逻辑右移主要是用来处理有符号整数的因为对于有符号整数其数据表示采用补码来进行。
什么是补码呢?
所谓补码就是指数据位数的表示在某种情况以一种方式计算无法表示而补码对于无符号整数的表示有很大的作用对于0以上的数一般以十进制数对应的二进制数的转换结果来表示但是对于负数这样的做法就不行因此在补码上以最高位表示负数比如对于-8其二进制表示就是1000,同时1000还能表示8,以补码的方式各个位上的数全为1时这个数就是-1;
那逻辑右移又是怎么移动的呢?
逻辑右移是根据最高位的位数来进行移动的最高为1则补1,为0则补0。
例子如下:
令x=1000(注意是二进制表示)
x>>2=1110即移动后x为-2;因为-8/2^2=-2所以结果正确
假设如果
x>>2=0010即进行算术右移其结果为2符号位为正所以错误。
这就是逻辑右移的作用。
2.2整数的表示
2.2.1整数表示方法
通过对补码的认识整数的表示应该有一个大概理解
对于有符号整数所采用的是正码表示即所有位都按二进制转十进制的方法来算。
对于无符号数则采用补码的方式即最高位以负数的形式表示
下面是关于C语言各类整型数据所表示范围的一个表:
C数据类型 | 最小值 | 最大值 |
[signed] char | -128 | 127 |
unsigned char | 0 | 255 |
short | -32768 | 32767 |
unsigned short | 0 | 65535 |
int | -2147483648 | 2147483467 |
unsigned | 0 | 4294967295 |
long | -2147483648 | 2147483467 |
unsigned long | 0 | 4294967295 |
int32_t | -2147483648 | 2147483467 |
uint32_t | 0 | 4294967295 |
int64_t | -9223372036854775808 | 9223372036854775807 |
uint64_t | 0 | 18446744073709551615 |
C数据类型 | 最小值 | 最大值 |
[signed] char | -128 | 127 |
unsigned char | 0 | 255 |
short | -32768 | 32767 |
unsigned short | 0 | 65535 |
int | -2147483648 | 2147483467 |
unsigned | 0 | 4294967295 |
long | -9223372036854775808 | 9223372036854775807 |
unsigned long | 0 | 18446744073709551615 |
int32_t | -2147483648 | 2147483467 |
uint32_t | 0 | 4294967295 |
int64_t | -9223372036854775808 | 9223372036854775807 |
uint64_t | 0 | 18446744073709551615 |
2.2.2有符号数和无符号数的转换
有符号数和无符号数主要差别在其编码方式因此转换也相对便于理解即把有符号数的最高位转化为 正数即在运算时作为正数而不是负数来计算。
如-1转换为无符号数将会变得所转换位数能表示的最大数因为-1的二进制是所有位数都为1.
2.2.3扩展一个数字的位数
扩展一个数字的位数主要是用来进行向上准换也就是向存储空间更大的类型转换
有两种扩展方式;
一个是零扩展即在高位补0主要用于无符号数的扩展
另一个是符号扩展即在高位补1是用于有符号数的扩展
2.2.3整数的运算
加法就是加法运算执行效率高
减法进行逆元元素即加法变减法执行效率高
乘法表左移操作分别拆分为2的次方数然后进行加减运算
除法和乘法基本相同但是除法是通过右移实现
2.3浮点数的表示
首先浮点数不区分有无符号
其在内存上分为三块即
整数位,符号位,小数位
小数位是以2的负次方来表示然后进行加操作其结果有一定的误差所以显示出来的是个近似值而不是实际值比如:
0.1+0.2=0.30000040;
至于其运算和整数大体相同