Go で uint8 を int8 に変換するとエラーが発生するのはなぜですか?

Barbara Streisand
リリース: 2024-10-30 12:43:02
オリジナル
167 人が閲覧しました

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

混乱 uint8 から int8 への変換

Go では、符号なし 8 ビット整数 (uint8) を符号付き 8 ビット整数 ( int8) を使用するとエラーが発生する可能性があります。その理由を調べてみましょう。

次のコードを考えてみましょう。

<code class="go">package main

import "fmt"

func main() {
    a := int8(0xfc)  // compile error
    fmt.Println(a)
}</code>
ログイン後にコピー

このコードでは、「定数 252 が int8 をオーバーフローします。」というコンパイル時エラーが発生します。この問題を理解するには、Go の定数式ルールを参照する必要があります。

言語仕様によれば、定数式は常に定数型の値で表現可能でなければなりません。この場合、0xfc は大きすぎて、範囲が -128 ~ 127 の int8 に収まりません。

次に示すように型変換を延期すると、コードはエラーなしでコンパイルされます。

<code class="go">package main

import "fmt"

func main() {
    a := 0xfc
    b := int8(a)  // ok
    fmt.Println(b)
}</code>
ログイン後にコピー

0xfc は int8 に変換される前に整数リテラルとして解釈されるため、これは機能します。整数リテラルとして、int8 の範囲外の値を保持できますが、コンパイラは実際の変換中に型チェックを強制します。

Go での整数変換に関する追加のポイント:

  • すべての整数値がすべての整数型に適合するわけではありません。たとえば、int64 は 9,223,372,036,854,775,807 より大きい値を保持できません。
  • 符号なし整数型 (uint8、uint16 など) は負の値を保持できません。
  • バイト (uint8 のエイリアス) を次のように変換するには符号付き整数型の場合は、次のパターンを使用できます:
<code class="go">var b byte = 0xff
i32 := int32(int8(b))</code>
ログイン後にコピー

これにより、元のバイトの符号が確実に保持されます。

以上がGo で uint8 を int8 に変換するとエラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!