Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah menukar uint8 kepada int8 dalam Go menyebabkan ralat?

Mengapakah menukar uint8 kepada int8 dalam Go menyebabkan ralat?

Barbara Streisand
Barbara Streisandasal
2024-10-30 12:43:02150semak imbas

Why does converting a uint8 to int8 in Go cause an error?

Kekeliruan Menukarkan uint8 kepada int8

Dalam Go, menukarkan integer 8-bit yang tidak ditandatangani (uint8) kepada integer 8-bit yang ditandatangani ( int8) boleh mengakibatkan ralat. Mari terokai sebabnya.

Pertimbangkan kod berikut:

<code class="go">package main

import "fmt"

func main() {
    a := int8(0xfc)  // compile error
    fmt.Println(a)
}</code>

Kod ini menimbulkan ralat masa kompilasi: "constant 252 overflows int8." Untuk memahami isu ini, kita perlu merujuk kepada peraturan ungkapan malar Go.

Menurut spesifikasi bahasa, ungkapan malar mesti sentiasa boleh diwakili oleh nilai jenis malar. Dalam kes ini, 0xfc terlalu besar untuk dimuatkan dalam int8, yang julatnya ialah -128 hingga 127.

Jika kita menangguhkan penukaran jenis, seperti yang ditunjukkan di bawah, kod tersebut akan disusun tanpa ralat:

<code class="go">package main

import "fmt"

func main() {
    a := 0xfc
    b := int8(a)  // ok
    fmt.Println(b)
}</code>

Ini berfungsi kerana 0xfc ditafsirkan sebagai literal integer sebelum ditukar kepada int8. Sebagai literal integer, ia boleh menyimpan nilai di luar julat int8, tetapi pengkompil menguatkuasakan semakan jenis semasa penukaran sebenar.

Beberapa mata tambahan mengenai penukaran integer dalam Go:

  • Tidak semua nilai integer boleh dimuatkan ke dalam semua jenis integer. Contohnya, int64 tidak boleh menyimpan nilai yang lebih besar daripada 9,223,372,036,854,775,807.
  • Jenis integer tidak bertanda (uint8, uint16, dll.) tidak boleh memegang nilai negatif.
  • Untuk menukar bait (an) alias bagi uint8 (an) jenis integer yang ditandatangani, anda boleh menggunakan corak berikut:
<code class="go">var b byte = 0xff
i32 := int32(int8(b))</code>

Ini memastikan tanda bait asal dikekalkan.

Atas ialah kandungan terperinci Mengapakah menukar uint8 kepada int8 dalam Go menyebabkan ralat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn