如果我用C ++正确,则LSB是最后一位,并确定整数的符号。因此,例如在8位的情况下,1111 1111将为-127,而1111 1110将为127。如果我错了,请更正我,但与我无关。
我会检查Go中整数的符号,所以我写了以下内容:
func signCheck(n int8) {
var sign int8 = 1<<7
if n&sign == 1 {
fmt.Printf("%d is odd - %b\n", n, n)
} else {
fmt.Printf("%d is even - %b\n", n, n)
}
}
这将打印出“常数128溢出int8”,但这是有道理的,因为因为只有7位用于确定数字。所以我修改如下:
func signCheck(n int8) {
if n&1<<7 == 1 {
fmt.Printf("%d is odd - %b\n", n, n)
} else {
fmt.Printf("%d is even - %b\n", n, n)
}
}
在这种情况下,我不必说它是int8,但是我用-127和127进行了测试,并得到以下打印结果:
-127 is even - -1111111
127 is even - 1111111
那么在那种情况下我应该如何检查标志?go版本go1.13.1 linux / amd64
为了表示负整数,Go(而且我相信C ++也像大多数语言一样)使用2的补码格式和标准。
1
如果数字为负,则以2的补码表示最高位(MSB),0
否则为最高。
在Go中,您不能使用具有0x80
类型常量的类型常量int8
,因为它超出了有效范围。
但是,您可以转换int8
为uint8
“无损”,然后可以这样做。
另外,在屏蔽0x80
位时,必须将结果与进行比较0x80
,因为x & 0x80
永远不会导致1
,只能在0
或中进行0x80
。
func signCheck(n int8) {
if uint8(n)&0x80 == 0x80 {
fmt.Printf("%d is negative - %b\n", n, n)
} else {
fmt.Printf("%d is non-negative - %b\n", n, n)
}
}
另一种选择是将屏蔽结果与0
:
if uint8(n)&0x80 != 0 { }
两种解决方案都提供输出(在Go Playground上尝试):
-127 is negative - -1111111
127 is non-negative - 1111111
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句