位:bit 最小单元 又叫比特数. 在数字世界里没有电影、没有杂志、没有一首首的乐曲,只有一个个的数字“1”和“0”。以前人们对于数字世界中的这两个数字还不知道如何命名,直到现1946年普林斯顿大学的统计学家约翰.土吉(john turkey)把它定为进制,才有了比特(Bit)这一术语。比特是电脑当中最小的单位。
字节:byte 机器语言的单位, 计算机中可单独处理的最小单位。 字长是ALU(算术逻辑部件)在一个时钟周期内最多能运算的二进制位数。
另外,Byte通常简写为B(大写),而bit通常简写为b(小写)。可以这么记忆,大写的为大单位,实际数值小,小写的为小单位,实际数值较大,1B=8b。
B=字节 KB=千字节 MB=兆字节 GB=千兆字节 由于计算机内部采用万能的二进制,而2的10次方1024又非常接近1000,于是很自然的就采用了1k=1024这种换算方式,非常方便。
1 Byte = 8 Bits 1 KB = 1024 Bytes 1 MB = 1024 KB 1 GB = 1024 MB可是硬盘厂商在描述自己产品容量时确没有采用这一方式,而是传统的1000进制,于是问题出现了。一块标称100GB的硬盘是100,000,000,000字节,换算成计算机内部的表示方法就只有93GB左右了,格式化后会更少一点。
1KB=1000B 1MB=1000KB 1GB=1000MB为了避免两种不同的换算方式带给消费者的困惑,Mac OS X和Linux开始陆续采用1000进制显示硬盘容量(注意是显示,也就是给人看的,实际上这个东西怎么换算和操作系统底层的使用一点关系都没有,如@pansz 提到的),这样消费者就可以在系统中看到和标称容量差不多一样大小的硬盘了。 这就造成了硬盘标称的容量和操作系统中显示的实际容量不同。
“字”由若干个字节构成,字的位数叫做字长,字长就是说字所对应的二进制数的长度。不同的机器有不同的字长。 例如一台8位机,它的1个字就等于1个字节,字长为8位。 如果是一台16位机,那么,它的1个字就由2个字节构成,字长为16位。 前期的DOS就是8位的,后期的DOS是16位的,Win9X是基于DOS的,所以也是16位的,NT核心的Windows是32位的,现在也有了64位的XP/2003,CPU也有了64位的,这个操作系统和CPU所说的位就是bit的意思,即二进制数的长度。 字节是固定由8位二进制构成,Byte 字节,由八个二进制位组成,是计算机中表示存储空间的最基本容量单位。 64位系统就代表了64位的二进制代表一个字,换算成字节就是64/8=8,即是说由8字节构成一个字,32位系统就是32/8=4,4个字节代表一个字。
在计算机中,数据只用0和1两种表现形式,(这里只表示一个数据点,不是数字),一个0或者1占一个“位”, 而系统中规定8个“位”为一个“字节”,用来表示常用的256个字母、符号、控制标记。 在64位计算机中,“一个字长”所占的字节数为8。 字长的字节数 = 计算机位数/8。单位 是“比特”,也就是“位”(bit,简称b),它表示 1个二进制位。 比“位”大的单位是“字节”(byte,简称B),它等于 8个二进制位。
平常我们说的32位机,64位机,说的就是32字长,64字长,英文叫word size
字长越大,CPU运算能力越牛逼:
4位 8位 16位 32位 64位,现在大部分CPU都这个水平字长:CPU一次操作可以处理的二进制位数(0或1), 1位= 1 bit
举例子: 一个字长是8的cpu,一次能进行不大于1111,1111 (8位) 的运算 一个字长是16的cpu ,一次能进行不大于 1111,1111,1111,1111(16位)的运算
常见的字符集有: ASCII 字符集, GB2312 字符集, BIG5 字符集, GB18030 字符集,Unicode 字符集,下面一一介绍:
定义: 美国信息互换标准代码,是基于罗马字母表的一套电脑编码系统,主要显示 英语和一些西欧语言,是现今最通用的单字节编码系统。
包含内容: 控制字符(回车键,退格,换行键等) 可显示字符(英文大小写,阿拉伯数字,西文符号) 扩展字符集(表格符号,计算符号,希腊字母,拉丁符号)
编码方式: 第 0-31 号及 127 号是控制字符或通讯专用字符; 第 32-126 号是字符,其中 48-57 号为 0-9 十个阿拉伯数字, 65-90 号为 26 个大写英文字母, 97-122 号为 26 个英文小写字母,其余为一些标点符号,运算符号等。 在计算机存储单元中,一个 ASCII 码值占一个字节( 8 个二进制位),最高位是用作奇偶检验位。【奇偶校验是指:在代码传送的过程中,用来检验是否出错的一种方法。】奇偶校验分为奇校验和偶校验。 信息是以比特流的方式传输的,类似01000001。在传输过程中,有可能会发生错误. 比如,我们存储了01000001,但是取出来却是01000000,即低位由0变成了1。为了检测到这种错误,我们可以通过“奇偶校验”来实现。 假如,我们存储的数据是一个字节,8个比特位,那我们就可以计算每个字节比特位是1的个数,如果是偶数个1,那么,我们就把第九个位设为1,如果是奇数个1,那么就把第九个位设为0,这样连续9个字节比特位为1的位数肯定是奇数。这中方法叫做“奇校验”,“偶校验”和此类似。当然,在实际应用中,也可以把一个字节的前7位作为数据位,最后一个为作为校验位。
奇校验规定:正确的代码一个字节中 1 的个数必须是奇数,若非奇数,则在最高位添 1; 偶校验规定:正确的代码一个字节中 1 的个数必须是偶数,若非偶数,则在最高位添1。校验方法 奇校验:就是让原有数据序列中(包括你要加上的一位)1的个数为奇数 1000110(0)你必须添0这样原来有3个1已经是奇数了所以你添上0之后1的个数还是奇数个。 偶校验:就是让原有数据序列中(包括你要加上的一位)1的个数为偶数 1000110(1)你就必须加1了这样原来有3个1要想1的个数为偶数就只能添1了。[1]
拉丁码表。欧洲码表 用一个字节的 8 位表示。
UTF-8:( 最多用三个字节来表示一个字符。) UTF8 是 unicode 其中的一个使用方式。 UTF 的意思是:unicode translation format,即把 unicode 转作某种格式的意思。 UTF-8使用可变长度字节来存储 unicode 字符,如 ASCII 字母还是采用一个字符来存储,希腊字母等采用 2 个字符来存储,而常用的汉字要使用 3 字节,辅助平面字符则使用 4 字节。
UTF-16: 使用一个或两个未分配的 16 位代码单元的序列对 unicode 代码 点进行编码,即 2 个字节表示一个字符。
UTF-32: 将每一个 unicode 代码点表示为相同值的 32 位整数。
关于 unicode 编码的一个问题: 使用记事本另存为时,可 以 在 ANSI , GBK,Unicode ,unicode big endian 和 UTF-8 这几种编码之间相互转换。同样是 txt 文 件, windows 是怎么识别编码的呢?
答:平时注意的话可以发现 Unicode, unicode big endian 和 UTF-8编码的 txt 文件的开头会多出几个字节,分别是(FF,FE),( FE,FF),( EF,BB,BF)。那么这些标记都是基于什么标准呢?ANSI 字符集: ASCII 字符集,以及由此派生并兼容的字符集。
如“连通”两个字,在 UTF-16 中为:DE 8F 1A 90,两个字节决定一个汉字;在 UTF-8 中则为: E8 BF 9E E9 80 9A,即 3个字节决定一个字符。
当一个软件打开一个文本时,首先是要决定这个文本究竟是使用哪种字符集的哪种编码保存的,软件一般采用三种方式来决定文本的字符集和编码:检测文件头标识,提示用户选择,根据一定的规则猜测。 不同编码方式的开头字节如下:
开头字节字符集的编码EF BB BFUTF-8FF FEUTF-16, little endianFE FFUTF-16, big endianFF FE 00 00UTF-32, little endian00 00 FE FFUTF-32, big endian注: endian(字节存储次序) 是指字节序, big endian(大尾)和 little endian(小尾)是 CPU 处理多字节数的不同方式。例如“汉”的 unicode 编码是 6C49,写到文件中,如果将 6C 写在前面就是 big endian,将 49写在前面就是 little endian。
从 ASCII, GB2312, GBK 到 GB18030,这些编码方法是向下兼容的,即同一个字符在这些方案中总是有相同的编码,后面的标准支持更多的字符。在这些编码中,英文和中文可以统一的处理。区分中文编码的方法是高字节的最高位不为0。
计算机使用的缺省编码方式就是计算机的内码。有的中文 windows 的缺省内码还是 GBK,可以通过 GB18030 升级包升级到 GB1030。不过相对 GBK 新增的字符,普通人很难用到的,通常我们用 GBK 来指代中文 windows 内码。
GB2312 的原文是区位码,从区位码到内码,需要在高字节和低字节上分别加上 A0。
出处 : kancloud 原文链接 :https://www.kancloud.cn/chandler/programming_road/695584