理解和识别带符号的数字

Understanding & identifying signed numbers

我是这个主题的新手,我很难理解 0xFFFFFFF 和 0x00000001 怎么会有相同的符号,而 0x0000001 和 0x12345678 却有不同的符号。根据我目前的理解,最高有效位在 0-7 之间的十六进制数字是正数,8-F 是负数。

为了进一步了解上下文,这是我试图理解的内容:

问题:完成C函数,执行运算并满足注释中指出的要求。

评论:

    /*
    * diffSign – return 1 if x and y have different signs 
    * Examples: diffSign(0xFFFFFFF, 0x00000001) = 0
    * diffSign(0x0000001, 0x12345678) = 1
    * Legal ops: & | ^ ~ << >>
    * 1-byte const (0x00 to 0xFF)
    */

答案:

     int diffSign(int x, int y) {
        return ((x >> 31) & 0x1) ^ ((y >> 31) & 0x1);
    }

如果可能的话,我也非常感谢您对 & 0x1 如何帮助我识别标志进行一些说明!这似乎是多余的,我不太确定它在等式中的重要性。

如果你仔细观察,这很有意义,只是你没有看到 0xFFFFFFF 的最高有效字节实际上是 0,因为有 7 个 F。

0xFFFFFFF = 0x0FFF FFFF

对于 32 位整数表示正数。

但是 0x0000001 和 0x12345678 也有相同的符号。因为造成差异的是最重要的 BIT。你是对的,最重要的 BYTE 在 0-7 之间的数字是正数,而 8-F 是负数。函数中注释错误

但是代码是正确的,因为它向右移动了 31 次,只在每个参数上留下最高有效位(每个参数的符号位)并执行 XOR,returns仅当两者不同时才为真。