计算机基础:硬件编码 (二进制正反补码、大小端编码)

1. 计算机中采用补码的方式存储负整数

Ref 1:  原码,反码, 补码 详解

Ref 2:  为什么计算机用补码存储数据

计算机以二进制存储数字。一个数在计算机中的二进制表示形式,被称为这个数的机器数,机器数的最高位(第一位)是符号位。

E.g. 十进制中的数 +3,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。这里的 00000011 和 10000011 就是机器数。

 

因为机器数是有符号的,所以机器数的形式值不等于真正的数值。我们将带符号位的机器数对应的真正数值称为机器数的真值

E.g. 0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1

 

对于“带符号整数”,计算机有三种二进制的编码方式:原码、反码、补码【绝对值->原码,按位求反->反码,反码加1->补码】。计算机中采用补码的方式存储负整数,原因是“方便计算”,简化硬件设计,避免0出现两个编码

E.g. 值0的补码形式为全0,值-1的补码形式为全1。对于一个数num不管正负,都可以通过取反加以计算得补码 (-num),这样便于计算机硬件实现。用补码表示减法计算时候,a - b = a + (-b) ,-b可以通过对b按位求反加1得到。


2. 计算机中浮点数的存储

Ref 1: 浮点数的运算原理--IEEE754

Ref 2: 浮点数的二进制表示

Ref 3: IEEE浮点运算标准(中文解释pdf)

Ref 4: IEEE 754-2008 浮点算术标准(英文原版PDF)

Ref 5: IEEE 754 1985vs2008对比



3.大端与小端(C语言中利用union特性可以判定大端还是小端)

Ref 1: 详解大端小端模式

大端模式 big-endian    字数据的高位字节存储在低地址, 低位字节存储在高地址

小端模式 little-endian   字数据的高位字节存储在高地址, 低位字节存储在低地址


#include 

int main( void )
{
    union check{
        int i;
        char ch;
    }c;
    c.i = 1;
    if( 1 == c.ch )
        printf("the system is little_endian./n");
    else
        printf("the system is big_endian./n");
    return 0;
}


在C语言中,不同于结构体,共用体(联合体)中的几种不同类型的变量存放在同一段内存单元中。利用这一特点,可以用联合体变量判断ARM或x86环境下,存储系统是是大端还是小端模式。

在32位机中, int  - 4 bytes, char  - 1 byte

1  在c中,联合体(共用体)的数据成员都是从低地址开始存放。

2  若是小端模式,由低地址到高地址c.i存放为0x01 00 00 00,c.ch被赋值为0x01;

3  若是大端模式,由低地址到高地址c.i存放为0x00 00 00 01,c.ch被赋值为0x0;





你可能感兴趣的:(C/C++,linux)