在计算机科学中,数据的表示和存储是编程的基础,尤其是对于C语言这样的底层语言来说更为重要。本节主要探讨了不同数制系统及其转换以及计算机内部如何存储数值。
首先,我们要理解数制的概念。数制是一种表示数字的方式,常见的有二进制(Binary)、八进制(Octal)、十进制(Decimal)和十六进制(Hexadecimal)。每个数制都有其基数(Base)和权重(Weight)。例如,十进制的基数是10,权重则由位置决定,如10²对应百位,10¹对应十位,10º对应个位。二进制的基数是2,八进制是8,十六进制是16。这些数制之间可以通过按权相加的方法进行转换。
例如,将十进制数59转换为二进制数,我们可以通过不断除以2并记录余数来实现,直到商为0。这个过程得到的余数序列就是二进制表示,即59 = 1*2^4 + 1*2^3 + 1*2^2 + 1*2^1 + 1*2^0,所以(59)10 = (111011)2。
同样,八进制和十六进制转换为十进制,或者将十进制转换为八进制或十六进制,也可以采用类似的方法。对于八进制,我们每次将数字除以8,而对于十六进制,则是除以16。在转换过程中,不足位数的部分可以用0填充,如二进制转八进制或十六进制时。
此外,对于二进制和八进制、二进制和十六进制之间的转换,我们可以每3位二进制转换为1位八进制,每4位二进制转换为1位十六进制。反之,八进制和十六进制转换为二进制,需要将每一位拆分成相应的二进制表示。
接下来,我们讨论计算机中数值的表示方法。在计算机内部,无论是正数还是负数,通常都是以“补码”形式存储的。补码的定义包括原码、反码和补码:
1. 原码:最高位为符号位,0表示正数,1表示负数,其余位表示数值的绝对值。
2. 反码:对于正数,反码与原码相同;对于负数,符号位保持不变,其他位取反。
3. 补码:正数的原码、反码和补码相同;负数的补码是将其原码取反后加1,即最高位保持1,其他位取反后再加1。
例如,整型数据在内存中以二进制形式存储,如变量i被赋值10或-10时,其在内存中的存储形式会体现出补码的特性。对于正数10,其二进制表示为00000000 00000000 00000000 00001010;对于负数-10,其原码为10000000 00000000 00000000 00001010,取反后为11111111 11111111 11111111 11110101,再加1得到补码11111111 11111111 11111111 11110110。
在C语言中,数据类型分为基本类型(如char、int、float等)、构造类型(如结构体、联合体等)和指针类型,以及无值类型。字符类型(char)用于存储单个字符,整型(int)用于存储整数,实型(float, double)用于存储小数。理解这些数据类型及其在内存中的表示方式,对于编写高效且正确的C语言程序至关重要。