Максимальное значение на 64 бит - PullRequest
0 голосов
/ 28 марта 2020

Ниже код компилируется:

package main

import "fmt"

const (
    // Max integer value on 64 bit architecture.
    maxInt = 9223372036854775807

    // Much larger value than int64.
    bigger = 9223372036854775808543522345

    // Will NOT compile
    // biggerInt int64 = 9223372036854775808543522345
)

func main() {
    fmt.Println("Will Compile")
    //fmt.Println(bigger) // error
}

Тип размер в памяти + представление битов в этой памяти

Что присваивается ли неявный тип bigger во время компиляции? Потому что ошибка constant 9223372036854775808543522345 overflows int для строки fmt.Println(bigger)

Ответы [ 3 ]

2 голосов
/ 28 марта 2020

Это нетипизированные константы. Они имеют более высокие пределы, чем типизированные константы:

https://golang.org/ref/spec#Constants

В частности:

Представляют целочисленные константы с не менее 256 битами.

1 голос
/ 28 марта 2020

Из этого комментария :

моя цель - преобразовать большее = 9223372036854775808543522345 в двоичную форму

мы находим, что ваш вопрос XY задача .

Поскольку мы знаем, что константа превышает 64 бита, нам нужно разбить ее на несколько 64-битных слов или сохранить в виде целого числа большего размера хранилище.

Go обеспечивает math/big для операций с большими числами общего назначения, или в этом случае мы можем воспользоваться тем, что легко хранить до 127-бит значения со знаком (или 128-битные значения без знака) в struct, содержащем два 64-битных целых числа (по крайней мере, одно из которых без знака).

Эта довольно тривиальная программа печатает результат преобразования в двоичный код:

500000000 x 2-sup-64 + 543522345 as binary:
111011100110101100101000000000000000000000000000000000000000000100000011001010111111000101001
package main

import "fmt"

const (
    // Much larger value than int64.
    bigger = 9223372036854775808543522345
    d64    = 1 << 64
)

type i128 struct {
    Upper int64
    Lower uint64
}

func main() {
    x := i128{Upper: bigger / d64, Lower: bigger % d64}
    fmt.Printf("%d x 2-sup-64 + %d as binary:\n%b%.64b\n", x.Upper, x.Lower, x.Upper, x.Lower)
}
1 голос
/ 28 марта 2020

Нет, это нетипизированная константа. Поскольку вы не присвоили его какой-либо переменной или не использовали в каком-либо выражении, ему «не нужно» давать представление как какой-либо конкретный тип. Числовые c константы в Go имеют практически неограниченную точность (для языка spe c требуется не менее 256 битов для целых чисел и не менее 256 битов мантиссы для чисел с плавающей точкой, но я считаю, что golang/go компилятор использует Go типы произвольной точности внутри, которые ограничены только памятью). См. раздел о константах в языке spe c.

Какая польза от константы, если вы не можете присвоить ее переменной любого типа? Ну, это может быть частью константного выражения . Выражения констант оцениваются с произвольной точностью, и их результаты могут быть присвоенными переменной. Другими словами, разрешено использовать значения, которые слишком велики, чтобы представлять их, чтобы получить ответ, который может быть представлен, если все эти вычисления происходят во время компиляции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...