理解和识别带符号的数字
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仅当两者不同时才为真。
我是这个主题的新手,我很难理解 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仅当两者不同时才为真。