Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Go 在这个例子中,位移位是如何工作的?_Go_Bit_Bit Shift - Fatal编程技术网

Go 在这个例子中,位移位是如何工作的?

Go 在这个例子中,位移位是如何工作的?,go,bit,bit-shift,Go,Bit,Bit Shift,我正在golang.org上阅读go教程,我遇到了一个我部分理解的例子 MaxInt uint64 = 1<<64 - 1 MaxInt uint64=1这里发生了什么,一步一步: 以1为例 将其向左移动64位。这很棘手。结果实际上需要65位来表示,即1后跟64个零。既然我们在这里计算一个64位的值,为什么它还要编译而不是溢出到0或1或产生编译错误 它之所以有效,是因为用于计算Go中常量的算法有点神奇(),因为它与所计算的命名常量的类型无关。你可以说foouint8=11a

我正在golang.org上阅读
go
教程,我遇到了一个我部分理解的例子

MaxInt uint64     = 1<<64 - 1

MaxInt uint64=1这里发生了什么,一步一步:

  • 以1为例

  • 将其向左移动64位。这很棘手。结果实际上需要65位来表示,即1后跟64个零。既然我们在这里计算一个64位的值,为什么它还要编译而不是溢出到0或1或产生编译错误


  • 它之所以有效,是因为用于计算Go中常量的算法有点神奇(),因为它与所计算的命名常量的类型无关。你可以说
    foouint8=1
    1ahh好的,所以减去1,第65位消失,留下
    111111….
    ?是的,你得到了!(但保留
    FFFF…(16个十六进制数字)
    ,或
    1111…(64个二进制1
    )减法在任何基数中都是一样的,就像在基数10
    1000-1=999
    中一样,少一位。@DavidC.Rankin不是专门用来表示有符号整数的两位补码吗?也就是说,没有无符号的两位补码编号系统(至少在编程中的二进制数上下文中没有)c.f。