Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah Penukaran `uint8` kepada `int8` dalam Go Membawa kepada Gelagat Tidak Dijangka?

Mengapakah Penukaran `uint8` kepada `int8` dalam Go Membawa kepada Gelagat Tidak Dijangka?

Susan Sarandon
Susan Sarandonasal
2024-10-26 19:33:03251semak imbas

Why Does Converting a `uint8` to an `int8` in Go Lead to Unexpected Behavior?

Penukaran Sekeliling Kekeliruan daripada uint8 kepada int8

Menukar uint8 kepada int8 dalam Go boleh membawa kepada tingkah laku yang tidak dijangka, seperti yang diserlahkan dalam perkara berikut contoh:

<code class="go">package main

import (
    "fmt"
)

func main() {
    a := int8(0xfc) // Compile error: constant 252 overflows int8
}</code>

Kod gagal dengan ralat masa kompilasi kerana pemalar 0xfc melebihi julat int8 (-128 hingga 127). Walau bagaimanapun, kod berikut disusun tanpa ralat:

<code class="go">package main

import (
    "fmt"
)

func main() {
    a := 0xfc
    b := int8(a) // Ok
}</code>

Perbezaannya terletak pada susunan operasi. Dalam contoh pertama, pemalar ditukar kepada int8 sebelum diberikan kepada a. Dalam contoh kedua, a mula-mula diberikan nilai 0xfc, dan kemudian ditukar kepada int8.

Menurut spesifikasi bahasa Go, ungkapan pemalar mesti boleh diwakili oleh jenis pemalar. Dalam kes ini, 0xfc tidak boleh diwakili oleh int8, yang membawa kepada ralat penyusunan.

Walau bagaimanapun, apabila penukaran dilakukan selepas penetapan, nilai a (yang bukan lagi pemalar) berada dalam julat int8, membolehkan penukaran berjaya.

Untuk kes penggunaan praktikal, pertimbangkan contoh berikut:

<code class="go">type Char byte

var c Char = '世' // Error: '世' has value 0x4e16, too large.</code>

Kod ini menimbulkan ralat kerana nilai pemalar '世' (0x4e16) melebihi julat bait (0 hingga 255). Untuk membetulkannya, seseorang boleh menggunakan teknik berikut:

<code class="go">var c Char = Char('世') // Ok</code>

Dalam kes ini, '世' mula-mula ditetapkan kepada jenis bait dan kemudian ditukar kepada Char. Ini memastikan bahawa nilai berada dalam julat jenis Char. Teknik yang sama boleh digunakan apabila menukar bait kepada int32 dengan pertimbangan untuk tanda nilai yang terhasil.

Atas ialah kandungan terperinci Mengapakah Penukaran `uint8` kepada `int8` dalam Go Membawa kepada Gelagat Tidak Dijangka?. 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