考虑一下Dennis ritchie在C book中给出的以下陈述
按位AND运算符&通常用于掩盖某些位,
例如
除了n = n & 0177;
n
的低位7位之外,设置为零。
关于逐位AND运算符,我的理解如下
11010010& 01101010 = 01000010
,即如果任何操作数中的相应位为0
,则设置为0但是在上面引用的语句中,除了最后一个7之外,它被告知这些位是0。
如果我们用二进制扩展0177,它将是10110001(8位),所以我们不能说低阶8位。哪里出错了?
答案 0 :(得分:4)
您将掩码转换为177,就像它是十进制一样。但事实并非如此:前导零使其成为八进制常数。
因此,它的二进制表示是
01111111
正如你所看到的,除了较低的7之外,它会屏蔽所有位。
在过去,八进制表示法一直受到PDP计算机程序员的欢迎,因为它让他们阅读"二进制代码更容易。它现在不那么流行了,十六进制表示法在定义二进制掩码时大多取代它。
答案 1 :(得分:3)
在C整数中,前缀为0的是八进制(基数为8),因此0177 = 001 111 111 2 。
在八进制中,每个数字0-7恰好代表3个二进制数字。它有些神秘和古老,例如12个字长的日子并不少见(例如PDP8)。这是一个不幸的表现形式,因为它更频繁地发现了不经常的警察而不是作为数字表示法更有用。
我在写位字段时的建议是坚持十六进制(在这种情况下为0x7f
),其中每个数字代表4个二进制数字,因此符合八个字长在现代建筑上。
如果您使用%i
格式说明符进行输入,则会偶然发生另一个问题 - 这也会分别将0
和0x
前缀解释为八进制和十六进制,这可能会导致混淆错误数据源生成前导十进制零。
答案 2 :(得分:1)
引用C11
,章节§6.4.4.1,(强调我的)
[...]八进制常量由前缀
0
组成,可选地后跟一个序列 数字0
至7
仅。 [...]
因此,0177
之类的整数常量是八进制,与十进制127
或十六进制7F
相同。二进制表示为您提供01111111
,这是
除了n
的低位7位之外,[...]设置为零。