为了账号安全,请及时绑定邮箱和手机立即绑定

整数符号和二进制与检查

整数符号和二进制与检查

Go
白猪掌柜的 2022-05-23 15:32:15
如果我在 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)    }}这将打印出“constant 128 overflows 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 - -1111111127 is even - 1111111那么在这种情况下我应该如何检查标志? 去版本 go1.13.1 linux/amd64去二元运算符
查看完整描述

1 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

为了表示负整数,Go(我相信 C++ 也像大多数语言一样)使用2 的补码格式和标准。


1在 2 的补码中,如果数字为负数,则最高位 (MSB) 将是,0否则。


在 Go 中,你不能使用0x80类型化常量int8作为它的类型,因为它超出了它的有效范围。


但是,您可以转换int8为uint8“无损”,然后您可以这样做。


此外,当您屏蔽该0x80位时,您必须将结果与 进行比较0x80,因为x & 0x80永远不会导致1,只能导致0or 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


查看完整回答
反对 回复 2022-05-23
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信