rokevin
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
移动
前端
语言
  • 基础

    • Linux
    • 实施
    • 版本构建
  • 应用

    • WEB服务器
    • 数据库
  • 资讯

    • 工具
    • 部署
开放平台
产品设计
  • 人工智能
  • 云计算
计算机
其它
GitHub
  • 单位

单位

介绍

位(bit)、比特(bit)、字节(Byte)、字

1位=1比特

1字=2字节

1字节=8位

1字=16位

字节就是Byte,比特可不是Byte而是bit,是二进制中的单位。

Byte字节的单位符号是被 国际电工委员会(IEC)、电气和电子工程师协会(IEEE)共同指定为大写字母B的。

计算机64位的 = 8个字节

那一个中文字符就一定等于两个字节吗?答案是不一定的,这要看编码表,如果是ASCII码的话一个汉字就是占两个字节,如果是UTF-8的话一个汉字就是占三个字节。

位

位是计算机存储的最小单位,简记为b,也称为比特(bit)计算机中用二进制中的0和1来表示数据,一个0或1就代表一位。位数通常指计算机中一次能处理的数据大小;

1字节=8位的由来

所谓字节,原意就是用来表示一个完整的字符的。

最初的计算机性能和存储容量都比较差,所以普遍采用4位BCD编码(这个编码出现比计算机还早,最早是用在打孔卡上的)。

BCD编码表示数字还可以,但表示字母或符号就很不好用,需要用多个编码来表示。

后来又演变出6位的BCD编码(BCDIC),以及至今仍在广泛使用的7位ASCII编码。

不过最终决定字节大小的,是大名鼎鼎的System/360。

当时IBM为System/360设计了一套8位EBCDIC编码,涵盖了数字、大小写字母和大部分常用符号,同时又兼容广泛用于打孔卡的6位BCDIC编码。

System/360很成功,也奠定了字符存储单位采用8位长度的基础,这就是1字节=8位的由来。

比特

比特(bit)是由英文BIT音译而来,比特同时也是二进制数字中的位,是信息量的度量单位,为信息量的最小单位;

字节

字节,英文Byte,是计算机用于计量存储容量的一种计量单位,通常情况下一字节等于八位,字节同时也在一些计算机编程语言中表示数据类型和语言字符,在现代计算机中,一个字节等于八位;

字

字是表示计算机自然数据单位的术语,在某个特定计算机中,字是其用来一次性处理事务的一个固定长度的位(bit)组,在现代计算机中,一个字等于两个字节。

字由若干个字节构成,字的位数叫做字长,不同档次的机器有不同的字长。例如一台8位机,它的1个字就等于1个字节,字长为8位。如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。字是计算机进行数据处理和运算的单位。

其他的单位相互之间的换算关系入下:

在计算机中,一串数码作为一个整体来处理或运算的,称为一个计算机字,简称字。字通常分为若干个字节(每个字节一般是8位)。在存储器中,通常每个单元存储一个字,因此每个字都是可以寻址的。字的长度用位数来表示。

在计算机的运算器、控制器中,通常都是以字为单位进行传送的。宇出现在不问的地址其含义是不相同。例如,送往控制器去的字是指令,而送往运算器去的字就是一个数。

在计算机中作为一个整体被存取、传送、处理的二进制数字符串叫做一个字或单元,每个字中二进制位数的长度,称为字长。一个字由若干个字节组成,不同的计算机系统的字长是不同的,常见的有8位、16位、32位、64位等,字长越长,计算机一次处理的信息位就越多,精度就越高,字长是计算机性能的一个重要指标。目前主流微机都是32位机。

注意字与字长的区别,字是单位,而字长是指标,指标需要用单位去衡量。正象生活中重量与公斤的关系,公斤是单位,重量是指标,重量需要用公斤加以衡量。

字长

计算机的每个字所包含的位数称为字长。根据计算机的不同,字长有固定的和可变的两种。固定字长,即字长度不论什么情况都是固定不变的;可变字长,则在一定范围内,其长度是可变的。

计算的字长是指它一次可处理的二进创数字的数目。计算机处理数据的速率,自然和它一次能加工的位数以及进行运算的快慢有关。如果一台计算机的字长是另一台计算机的两倍,即使两台计算机的速度相同,在相同的时间内,前者能做的工作是后者的两倍。

一般地,大型计算机的字长为32―64位,小型计算机为12―32位,而微型计算机为4一16位。字长是衡量计算机性能的一个重要因素。

字块

在信息处理中,一群字作为一个单元来处理的称为“字块”.也称“字组”。例如,储存于滋鼓的一个磁道上的字群就称为一个字块。在磁带上通常每120个字符就间隔一个字块际志,也称为一个字块。块与块之间一般留1.27―2.54厘米(1/2一1英寸)的间隔。在大容量存储中,信息都是以字块为单位而存入的,因此只有字块才是可选址的。目前,在高速绥冲技术中也引入了“字块”的概念。

查找一台计算机上的字长就是看CPU是几位的.

1 Byte(B)= 8 bit;

1 Kilo Byte(KB) = 1024B;

1 Mega Byte(MB) = 1024 KB;

1 Giga Byte (GB)= 1024 MB;

1 Tera Byte(TB)= 1024 GB;

1 Peta Byte(PB) = 1024 TB;

1 Exa Byte(EB) = 1024 PB;

1 Zetta Byte(ZB) = 1024 EB;

1 Yotta Byte(YB)= 1024 ZB;

1 Bronto Byte(BB) = 1024 YB;

1 Nona Byte(NB)=1024 BB;

1 Dogga Byte(DB)=1024 NB;

1 Corydon Byte(CB)=1024DB;

1 Xero Byte (XB)=1024CB;

字节序

字节顺序是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。

小端字节序指低字节数据存放在内存低地址处,高字节数据存放在内存高地址处;

大端字节序是高字节数据存放在低地址处,低字节数据存放在高地址处。

基于X86平台的PC机是小端字节序的,而有的嵌入式平台则是大端字节序的。所有网络协议也都是采用big endian的方式来传输数据的。所以有时我们也会把big endian方式称之为网络字节序。

比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian
低地址                                            高地址
---------------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     12     |      34    |     56      |     78    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian
低地址                                            高地址
---------------------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|     78     |      56    |     34      |     12    |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

从上面两图可以看出,采用Big Endian方式存储数据是符合我们人类的思维习惯的。

联合体union的存放顺序是所有成员都从低地址开始存放,利用该特性,就能判断CPU对内存采用Little-endian还是Big-endian模式读写。

示例代码如下:

union test{
    short  i;
    char str[sizeof(short)];
}tt;

void main()
{
    tt.i = 0x0102;
    if(sizeof(short) == 2)
        {
            if(tt.str[0] == 1 && tt.str[1] == 2)
                printf("大端字节序");
            else if(tt.str[0] = 2 && tt.str[1] == 1)
                printf("小端字节序");
            else
                printf("结果未知");
         }
    else
        printf("sizof(short)=%d,不等于2",sizeof(short));
}

字节对齐

现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问,这就需要各种类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。

为什么要进行字节对齐

  1. 某些平台只能在特定的地址处访问特定类型的数据;
  2. 最根本的原因是效率问题,字节对齐能提⾼存取数据的速度。

比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量,但是若从奇地址单元处存放,则需要2个读取周期读取该变量。

字节对齐的原则

  1. 数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在 offset 为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int在32位机为4字节,则要从4的整数倍地址开始存储。
  2. 结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char,int ,double等元素,那b应该从8的整数倍开始存储。)
  3. 收尾工作:结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

扩展

MB/s和Mbit/s的差异

MB/s的含义是兆字节每秒,Mbit/s的含义是兆比特每秒,前者是指每秒传输的字节数量,后者是指每秒传输的比特位数。

MB/s中的B字母是Byte的含义,虽然与Mbit/s中的bit翻译一样,都是比特,也都是数据量度单位,但二者是完全不同的。

Byte是字节数,bit是位数,在计算机中每八位为一字节,也就是1Byte=8bit,是1:8的对应关系。因此1MB/s等于8Mbit/s。因此在在书写单位时一定要注意B字母的大小写,尤其有些人还把Mbit/s简写为Mb/s,此时B字母的大小真可以称为失之毫厘,谬以千里。

上面这是一般情况下MB/s与Mbit/s的对应关系,但在硬盘的数据传输率上二者就不能用一般的MB和Mbit的换算关系(1B=8bit)来进行换算。

比如某款产品官方标称的内部数据传输率为683Mbit/s,此时不能简单的认为683除以8得到85.375,就认为85MB/s是该硬盘的内部数据传输率。因为在683Mbit中还包含有许多bit(位)的辅助信息,不完全是硬盘传输的数据,简单的用8来换算,将无法得到真实的内部数据传输率数值。

最近更新:: 2020/7/30 22:11
Contributors: luokaiwen