位操作
运算符:~、&、|、、>>、<<、&=、|=、=、>>=、<<=
二进制、十进制、十六进制
位运算符位字段
_Alignas _Alignof
二进制、位和字节
计算机适用基底为2的数制系统。它用2的幂而不是10的幂。以2为基 底表示的数字被称为二进制数(binary number)。二进制中的2和十进制中 的10作用相同。例如,二进制数1101可表示为:
1×2^3 + 1×2^2+ 0×2^1+ 1×2^0
以十进制数表示为:1×8 + 1×4 + 0×2 + 1×1 = 13
用二进制系统可以把任意整数(如果有足够的位)表示为0和1的组合。 由于数字计算机通过关闭和打开状态的组合来表示信息,这两种状态分别用 0和1来表示,所以使用这套数制系统非常方便。
二进制整数
通常,1字节包含8位。C语言用字节(byte)表示储存系统字符集所需 的大小,所以C字节可能是8位、9位、16位或其他值。不过,描述存储器芯片和数据传输率中所用的字节指的是8位字节(计算机界通常用八位组(octet)这个术语特指8位字节)。
可以从左 往右给这8位分别编号为7~0。在1字节中,编号是7的位被称为高阶位 (high-order bit),编号是0的位被称为低阶位(low-order bit)。每 1位的 编号对应2的相应指数。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Nuh8AGdJ-1589358158972)(image/2020-05-13-10-44-35.png)]
这里,128是2的7次幂,以此类推。该字节能表示的最大数字是把所有 位都设置为1:11111111。这个二进制数的值是:
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255
而该字节最小的二进制数是00000000,其值为0。因此,1字节可储存0 ~255范围内的数字,总共256个值。或者,通过不同的方式解释位组合 (bit pattern),程序可以用1字节储存-128~+127范围内的整数,总共还是 256个值。例如,通常unsigned char用1字节表示的范围是0~255,而signed char用1字节表示的范围是-128~+127。
有符号整数
如何表示有符号整数取决于硬件,而不是C语言。也许表示有符号数最 简单的方式是用1位(如,高阶位)储存符号,只剩下7位表示数字本身(假设储存在1字节中)。用这种符号量(sign-magnitude)表示法,10000001表 示−1,00000001表示1。因此,其表示范围是−127~+127
这种方法的缺点是有两个0:+0和-0。这很容易混淆,而且用两个位组 合来表示一个值也有些浪费。
*二进制补码(two’s-complement)*方法避免了这个问题,是当今最常用的系统。
二进制补码用1字节中的后7 位表示0~127,高阶位设置为0。目前,这种方法和符号量的方法相同。另 外,如果高阶位是1,表示的值为负。这两种方法的区别在于如何确定负 值。从一个9位组合100000000(256的二进制形式)减去一个负数的位组 合,结果是该负值的量。例如,假设一个负值的位组合是 10000000,作为 一个无符号字节,该组合为表示 128;作为一个有符号值,该组合表示负值 (编码是 7的位为1),而且值为100000000-10000000,即 1000000(128)。因此,该数是-128(在符号量表示法中,该位组合表示 −0)。类似地,10000001 是−127,11111111 是−1。该方法可以表示−128~ +127范围内的数。
要得到一个二进制补码数的相反数,最简单的方法是反转每一位(即0 变为1,1变为0),然后加1。因为1是00000001,那么−1则是11111110+1, 或11111111。
二进制浮点数
浮点数分两部分储存:二进制小数和二进制指数。
- 二进制小数
一个普通的浮点数0.527,表示如下:
5/10 + 2/100 + 7/1000
从左往右,各分母都是10的递增次幂。在二进制小数中,使用2的幂作 为分母,所以二进制小数.101表示为:
1/2 + 0/4 + 1/8
用十进制表示法为:
0.50 + 0.00 + 0.125
即是0.625。
许多分数(如,1/3)不能用十进制表示法精确地表示。与此类似,许 多分数也不能用二进制表示法准确地表示。实际上,二进制表示法只能精确 地表示多个1/2的幂的和。因此,3/4和7/8可以精确地表示为二进制小数,但 是1/3和2/5却不能。
- 浮点数表示法
为了在计算机中表示一个浮点数,要留出若干位(因系统而异)储存二 进制分数,其他位储存指数。一般而言,数字的实际值是由二进制小数乘以 2的指定次幂组成。例如,一个浮点数乘以4,那么二进制小数不变,其指数 乘以2,二进制分数不变。如果一份浮点数乘以一个不是2的幂的数,会改变 二进制小数部分,如有必要,也会改变指数部分。
其他进制数
八进制
八进制(octal)是指八进制记数系统。该系统基于8的幂,用0~7表示 数字(正如十进制用0~9表示数字一样)。例如,八进制数451(在C中写 作0451)表示为:
4×8^2+ 5×8^1+ 1×8^0= 297(十进制)
了解八进制的一个简单的方法是,每个八进制位对应3个二进制位。
[外链图片转存失败,源站可能有防盗链机制,建议将