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

Susan Sarandon
Lepaskan: 2024-10-26 19:33:03
asal
260 orang telah melayarinya

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

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

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

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

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!

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!