>  기사  >  백엔드 개발  >  big.Int를 int64로 또는 그 반대로 변환하고 2의 보수로 변환

big.Int를 int64로 또는 그 반대로 변환하고 2의 보수로 변환

王林
王林앞으로
2024-02-09 17:51:09385검색

将 big.Int 转换为 int64,反之亦然以及二进制补码

php 에디터 Youzi가 PHP에서 big.Int를 int64로 변환하는 방법, int64를 big.Int로 변환하는 방법을 소개하겠습니다. 컴퓨터 프로그래밍에서 big.Int와 int64는 두 가지 다른 데이터 유형입니다. big.Int는 큰 정수를 처리하는 데 사용되는 반면 int64는 64비트 부호 있는 정수 유형입니다. 유형 변환을 할 때 컴퓨터에서 부호 있는 정수를 표현하는 방법인 2의 보수 개념에 주의할 필요가 있습니다. 다음으로 이 두 유형 간의 변환 프로세스를 자세히 설명하겠습니다.

질문 내용

128비트 정수를 나타내는 go big.int를 [2]int64로 변환하려고 합니다. 아이디어는 128비트 부호 있는 정수를 리틀 엔디안 바이트 순서로 인코딩하는 Rust의 i128::to_le_bytes()를 일치시킬 수 있다는 것입니다. 이 예는 Rust의 i128::to_le_bytes()와 일치합니다. 다시 big.int로 변환하려고 할 때마다 동일한 값을 얻지 못합니다. 초기 오른쪽 시프트를 수행할 때 비트가 손실됩니까? 감사해요.

package main
 
import (
    "encoding/binary"
    "fmt"
    "math/big"
)
 
func main() {
    initial := new(big.Int)
    initial.SetString("-42", 10)
 
    value, _ := new(big.Int).SetString("-42", 10)
 
    var result [2]int64
 
    result[0] = value.Int64()
    result[1] = value.Rsh(value, 64).Int64()
 
    leRepresentation := make([]byte, 16)
 
    binary.LittleEndian.PutUint64(leRepresentation[:8], uint64(result[0]))
    binary.LittleEndian.PutUint64(leRepresentation[8:], uint64(result[1]))
 
    fmt.Println(leRepresentation)
 
    fmt.Println(result)
 
    reverse := big.NewInt(result[1])
    reverse.Lsh(reverse, 64)
    reverse.Add(reverse, big.NewInt(result[0]))
 
    fmt.Println(reverse.String())
 
    fmt.Println(initial.String() == reverse.String())
}

Solution

여기에 질문이 많습니다:

value 无法用 int64 表示,因此 value.int64()의 결과는 정의되지 않았습니다.

낮은 비트는 변환하기 전에 고려되지 않습니다 int64 的签名结果,因此您可能会在结果中添加负数。您需要使用 uint64 (或者至少在将其添加到 big.int.

원래 값을 rsh 方法中改变 value,因此即使正确重新创建了该值,最后的比较也会失败。如果要比较的话,新建一个 big.int 저장하고 있습니다.

원한다면 big.int 的原始数据表示形式恰好为 128 位,您可以使用 fillbytes방법. 우리는 빅엔디안 데이터를 가져와서 다음과 같이 2개의 64비트 값을 만들 수 있습니다:

으아악

이제 바이트 순서가 고정되었으므로 결과에 부호 비트를 추가하세요. 그러나 int128처럼 작동하려면 2의 보수를 사용하여

기호를 설정해야 합니다. 으아악

big.int를 만들려면 전체 과정을 반대로 진행하세요.

으아악

여러 키 값 테스트의 예: https://go.dev/play/ p/e1e-5cilflr

출력이 부호 없는 값으로 기록되므로 maxint128보다 큰 값으로 시작할 수 있는 경우 부호 있는 값이 오버플로되지 않도록 확인하는 검사도 추가해야 합니다. [2]int64 会更加混乱,因为我们需要 uint64 值进行按位运算,并且我们需要确保 int64 值不会通过它们自己的补码进行滚动。在这种情况下,围绕给定函数将 [2]int64[2]uint64로 저장하면 서로 변환하는 것이 더 쉽습니다.

위 내용은 big.Int를 int64로 또는 그 반대로 변환하고 2의 보수로 변환의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 stackoverflow.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제