计算机数据表示
送入计算机的数字,字母,符号等信息必须转换成0、 1组合的数据形式才能被计算机识别。
能够进行算术运算得到明确数值概念的信息称为计算机数值数据,其余的信息称为非数值数据。
从计算机本质的角度而言,它所处理的数据,大体分为数值型数据和非数值型数据。我们来看一下什么叫做数值型的数据,其实我们整个给计算机的数据,不管是什么,最终电脑要处理的都是0、1组合的数据形式。并且我们将能进行算术运算的数据称之为数值数据,不能进行算术运算的数据,比如字母等,我们就称它为非数值型的数据。
数值数据的表示
包括十进制、二进制、十六进制和八进制。
基数与各数位的权
-
基数是指该进位制中允许选用的基本数码的个数。如十进制数,基数为10, 可选用0、1、2……9共10个不同数码中的任何一个数。
-
而位权的大小是指以基数为底,数字所在位置的序号为指数的整数次幂。
在计算机科学中,位权(Bit Weight)通常用于表示数字在进制中的每个位所代表的权值。比如在二进制数中,每个位的权值都是 2 的幂,从右到左依次为 2 0 , 2 1 , 2 2 , 2 3 2^0, 2^1, 2^2, 2^3 20,21,22,23… 以此类推。
例如,在 8 位二进制数中,从右到左的位权分别为:1、2、4、8、16、32、64、128。如果一个二进制数为 11010101,我们可以根据位权计算其对应的十进制值: ( 1 ∗ 1 ) + ( 0 ∗ 2 ) + ( 1 ∗ 4 ) + ( 0 ∗ 8 ) + ( 1 ∗ 16 ) + ( 0 ∗ 32 ) + ( 1 ∗ 64 ) + ( 1 ∗ 128 ) = 213 (1 * 1) + (0 * 2) + (1 * 4) + (0 * 8) + (1 * 16) + (0 * 32) + (1 * 64) + (1 * 128) = 213 (1∗1)+(0∗2)+(1∗4)+(0∗8)+(1∗16)+(0∗32)+(1∗64)+(1∗128)=213.
所以,位权指的是每个位上数字所代表的权值。但是,位权不等同于幂,幂是更广义的概念,可以是任何数字的指数运算,而位权是在计算机科学中用于二进制数的特定用法。
在不同的数字系统中,位权的计算方式会有所不同,但基本原理是一致的:每个位置上的位权决定了该位置上的数字在整个数字中所代表的值的大小。
比如:
123 = 1X100 + 2X10 + 3X1
= 1X10^2 + 2X10^1 + 3X10^0
在数字 123 中,百位的位权为 100,十位的位权为 10,个位的位权为 1。
二进制
基数为2的进位制叫二进制
二进制只有0、1两种数码,计数逢2进位
1010 = 1X2^3 + 0X2^2 + 1X2^1 + 0X2^0
= 1X8 + 0X4 + 1X2 + 0X1
= 10
八进制数
-
在大多数编程语言中,表示八进制数时通常使用以数字 0 为开头的前缀。在C语言和类似C语法的语言中,表示八进制数的前缀是
0
。在Python中,表示八进制数的前缀是0o
(字母 “o” 的小写形式)。 -
例如,要表示八进制数 34,在C语言中可以写成
034
,在Python中可以写成0o34
。 -
请注意,现代编程语言中,八进制表示方式不如十进制和十六进制常用,通常更推荐使用十进制和十六进制来表示数字。
十六进制
基数为16的进位制叫十六进制
16进制对应4个二进制位, 因为4个二进制位最小是0, 最大是15, 所能表示基数的范围0~15, 同理八进制对应3个二进制位
十六进制有0、1、2…9、a、b、c、d、e、f 共16种数码,计数逢16进位
0x1010 = 1X16^3 + 0X16^2 + 1X16^1 + 0X16^0
= 1X4096 + 0X256 + 1X16 + 0X1
= 5012
非数值数据表示
非数值数据包括文字、符号、图像、语言和逻辑信息等,也都是以0、1形式存在。
字符数据在机器内也被变换成二进制编码的形式。国际上普遍采用的一种编码是美国国家信息交换标准代码,简称为ASCII码。
char unsigned char 1字节 00000000~11111111 0~255
ASCII
第一部分由 00H 到 1FH 共 32 个,一般用来通讯或作为控制之用,有些字符可显示于屏幕,有些则无法显示在屏幕上。
第二部分是由 20H 到 7FH 共 96 个,这 96 个字符是用来表示阿拉伯数字、英文字母大小写和底线、括号等符号,都可以显示在屏幕上。
第三部分由 80H 到 0FFH 共 128 个字符,一般称为『扩充字符』,这 128 个扩充字符是由 IBM 制定的,并非标准的 ASCII 码。这些字符是用来表示框线、音标和其它欧洲非英语系的字母。
当我们的电脑在实际执行程序时,它会将所有的数据都视为机器码。例如,如果你给它一个整数,它会在内存中以补码的形式进行处理。但是,如果你给它一个字符(比如字母"a"或"b"),它会用一种特定的规则将其转化成二进制的0101形式。这个规则就是ASCII码表,它是美国国家信息标准中规定的表格。这个表格包含了常见的英文字母和一些特殊字符的对应关系。因此,当你遇到一个字母,比如"A",你可以将它转换成ASCII码, 即65。这样,计算机就能够正确地处理和表示这些字符数据了。字母在电脑看来也是一个固定的整数
原码, 反码, 补码
-
原码、反码和补码都是计算机中用于表示带符号整数的表示方式。
- 原码(Sign-Magnitude):
原码表示法最直观,是将一个整数的绝对值转换为二进制表示,然后再在最高位也就是符号位变为0或1(0 表示正数,1 表示负数)。例如,对于一个 8 位的整数,+3 的原码表示为00000011
,-3 的原码表示为10000011
。
原码的优点是简单易懂,直接表示了数值的大小和符号。但是,原码的缺点是存在正零(+00000000)和负零(10000000)的表示,而且计算机在进行加减法运算时需要特殊处理符号位,导致加减运算较为复杂。
- 反码(One’s Complement):
为了解决原码的加减运算复杂性,人们引入了反码表示法。对于正数,反码与原码相同;对于负数,反码是将原码中除符号位外的所有位取反(0 变为 1,1 变为 0)。例如,+3 的反码表示为00000011
,-3 的反码表示为11111100
。
反码的优点是简化了加减运算,使得加减法可以使用相同的硬件逻辑。但是,反码的缺点是存在两个零表示:+0 和 -0。这也导致了一些运算的问题。
- 补码(Two’s Complement):
为了解决反码中存在两个零的问题,并使加减运算更加简化,人们引入了补码表示法。在补码中,正数的表示与原码和反码相同;而负数的表示是将其反码加 1(这个1是加在反码的最低有效位(最右边)上。)。例如,+3 的补码表示为00000011
,-3 的补码表示为11111101
。
如果补码的符号位为“1”,表示是一个负数,补码求原码的操作可以是:符号位为1,其余各位取反,然后再加1。
- 原码(Sign-Magnitude):
-
补码的优点是只有一个零,且加减法的运算可以直接使用硬件的加法器,非常高效。补码也可以很方便地进行溢出处理。
-
因此,补码是计算机中表示带符号整数最常用的方式。绝大多数现代计算机都使用补码表示法来处理整数运算。
原码表示形式中,0有两种表示,即
+0 :0000 0000;
-0 :1000 0000。
反码表示形式中,0有两种表示,即
+0:0000 0000;
-0:1111 1111;
补码表示形式中,0只有一种表示,即
+0=(-0):0000 0000。
关于为什么用补码表示有符号整数, 大家可以看看这位大佬的文章:
补码原理——负数为什么要用补码表示
拓展;
-
在计算机中,我们无法直接从一个数字的二进制表示中判断它是原码还是反码。原码和反码只是表示一个带符号整数的不同方式,其二进制形式是相同的,所以无法直接通过二进制形式判断。
-
要判断一个数字是原码还是反码,通常需要其他信息,例如上下文或者约定。在实际应用中,会根据特定的规则或协议来确定数字的表示方式。
总结和思考
总结
-
掌握各种进制之间的转换
-
熟悉ASCII码表
思考
-
字符型数据如何表示?
-
在计算机中,字符型数据是通过字符编码来表示的。常见的字符编码包括ASCII码(American Standard Code for Information Interchange)和Unicode。
-
ASCII码是最早的字符编码,它使用7位二进制来表示128个字符,包括数字、字母、标点符号和控制字符等。例如,字符 ‘A’ 在ASCII码中表示为
01000001
,字符 ‘a’ 表示为01100001
。 -
随着计算机技术的发展,需要表示更多的字符,于是产生了Unicode编码。Unicode使用16位二进制来表示字符,可以表示更多的字符,包括各种语言的字符、符号、表情等。例如,字符 ‘A’ 在Unicode编码中表示为
00000000 01000001
,字符 ‘a’ 表示为00000000 01100001
。 -
为了在计算机中表示字符型数据,通常使用字符型变量或字符数组来存储字符。在C语言中,字符型数据使用
char
类型来表示,可以使用单引号将字符括起来,例如:char ch = 'A';
-
或者使用字符数组来存储多个字符:
char str[] = "Hello";
-
每个字符在内存中占用一个字节(8位),通过字符编码,计算机可以正确地识别和处理各种字符。
-
-
字符’0’和整数0有什么区别?
- 字符 ‘0’ 和整数 0 在计算机中是不同的数据类型和表示方式。
-
字符 ‘0’:
- 字符 ‘0’ 是一个字符型数据,在C语言中使用
char
类型表示。 - 字符 ‘0’ 在ASCII码中的表示是
00110000
,十进制为 48。ASCII码中的字符 ‘0’ 是数字零字符。 - 在C语言中,字符型数据使用单引号将字符括起来,例如
char ch = '0';
- 字符 ‘0’ 是一个字符型数据,在C语言中使用
-
整数 0:
- 整数 0 是一个整型数据,在C语言中使用
int
类型表示。 - 整数 0 表示数值零。
- 在C语言中,整数型数据直接写成数值形式,例如
int num = 0;
- 整数 0 是一个整型数据,在C语言中使用
-
虽然字符 ‘0’ 的ASCII码表示和整数 0 的数值相同,但它们在计算机中是不同的数据类型。字符 ‘0’ 是一个字符型数据,用来表示字符 ‘0’,而整数 0 是一个整型数据,用来表示数值零。
-
需要注意的是,虽然字符 ‘0’ 和整数 0 的表示在ASCII码中是一样的,但它们在计算和处理时需要按照各自的数据类型来进行。在C语言中,字符型数据和整型数据可以进行一些转换,但在进行计算或比较时需要特别注意数据类型的转换和处理。