我正在排序IP地址空间前缀的“子”。例如,8.8.8.0/24是IP地址空间中8.8.8.0/23的子节点。我很困惑,为什么以下两个操作在我的x86小端系统上提供不同的结果大端排序和小端排序差别的按位操作
稍微背景信息: A/24意味着32位IPv4地址的前24位是“已定义”的。这意味着8.8.8.0/24包含8.8.8.0 - 8.8.8.255。同样,对于没有定义的每一位,地址空间量都会增加一倍。 8.8.8.0/23只能定义前23位,所以实际地址空间从8.8.8.0到8.8.9.255,或者是/ 24的两倍。
我现在有点混乱与以下bitshifts
inet_addr("8.8.8.0") << (32 - 23) produces 269488128
inet_addr("8.8.9.0") << (32 - 23) produces 303042560
inet_addr产生大端数。但是,将其转换为小端时 -
htonl(inet_addr("8.8.8.0")) >> 9 produces 263172
htonl(inet_addr("8.8.9.0")) >> 9 produces 263172
这是预期的结果。理论上,删除最后9位将意味着8.8.9.0等于8.8.8.0。
我在这里错过了什么?它不应该在大型排序中工作吗?
编辑:不是重复的,因为我的确了解endianness如何影响数字存储方式的区别,但我明显错过了这些按位运算符。问题是更多的是按位而不是endianness - endianness只是在那里培养一个例子
可能的重复[简单的按位操作的小尾数整数,在大端机?](http://stackoverflow.com/questions/5642981/simple-bitwise-manipulation-for-little-endian-integer- in-big-endian-machine) –
这4个输出中的哪一个出乎意料?你期望什么价值? –
前两个产出是意料之外的。我期望前两个输出相等,就像第三个和第四个输出相等 – dreadiscool