Mengapakah menukar uint8 kepada int8 dalam Go menyebabkan ralat?

Barbara Streisand
Lepaskan: 2024-10-30 12:43:02
asal
168 orang telah melayarinya

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!