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

原创 2017年01月04日 17:34:57

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 <stdio.h>

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;





版权声明:本文为博主原创文章,未经博主允许不得转载。

深入理解计算机系统(2.3)---整数的表示方式精解》无符号与补码编码(重要)

上一章我们简单的介绍了布尔代数以及C语言的位运算,本次我们主要来看,二进制如何表示整数,这是很重要的一章,希望各位猿友莫要错过。   C语言中的整数类型及范围              我们依...

文本文件及二进制文件的大小, Unicode字符编码

今天看别人写的程序, 有一点不是很明白, 就是在mfc的程序中利用CFile在写文件时是怎么区别二进制文件和文本文件的. 首先说一下二进制文件和文本文件的区别: 从网上找到一篇文章, 写的...

文本文件及二进制文件的大小, Unicode/utf-8/ansi编码格式

今天看别人写的程序, 有一点不是很明白, 就是在mfc的程序中利用CFile在写文件时是怎么区别二进制文件和文本文件的. 首先说一下二进制文件和文本文件的区别: 从网上找到一篇文章, 写的挺基础,...

[深入理解计算机系统]数据储存-大小端法与补码

#include typedef unsigned char *byte_pointer; void show_byte(byte_pointer start,int len) { int i...

二进制(1):无符号编码和补码编码

二进制既是将不同长度的“位”(一个1或0)组合在一起再加上不同的解释以赋予含义。同样的机器代码[ 1000 1010] 在不同的编码模式下的意义是不同的。 这里分析一下无符号编码,既是C语言中的uns...

编码:隐匿在计算机软硬件背后的语言(3)--二进制加法器

8位二进制加法器
  • hit_why
  • hit_why
  • 2016年11月29日 22:29
  • 257

编码:隐匿在计算机软硬件背后的语言(4)--二进制减法器

二进制减法器
  • hit_why
  • hit_why
  • 2016年12月04日 21:45
  • 165

另一个视角解读计算机编码-补码编码

数学是一个完全抽象的学科,而计算机是这个学科的一种形象化的实现,显然无法处理一些仅在抽象意义上有意义的特殊“数字”,比如无穷之类的东西,。像数学中的加法,乘法这样运算,计算机必须给与实现,然而由于数学...

另一个视角解读计算机编码-补码编码

文章出处:http://blog.csdn.net/dog250/article/details/6176059       数学是一个完全抽象的学科,而计算机是这个学科的一种形象化的实现,显...
  • ixidof
  • ixidof
  • 2013年06月11日 12:01
  • 1247

另一个视角解读计算机编码-补码编码

2011-02-09 21:13 7431人阅读 评论(38) 收藏 举报 语言汇编c 数学是一个完全抽象的学科,而计算机是这个学科的一种形象化的实现,显然无法处理一些仅在抽象意义上有意义...
  • pi9nc
  • pi9nc
  • 2013年09月03日 21:50
  • 705
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:计算机基础:硬件编码 (二进制正反补码、大小端编码)
举报原因:
原因补充:

(最多只允许输入30个字)