2017-09-29 3 views
0
var x uint64 = 257 
var y int = 257 
fmt.Println("rv1 is ", byte(x))  // ok 
fmt.Println("rv2 is ", byte(y))  // ok 
fmt.Println("rv3 is ", byte(257))  // constant 257 overflows byte 
fmt.Println("rv4 is ", byte(int(257))) // constant 257 overflows byte 

これは変です。バイトをintに変換する

これらのすべてがintをバイトに変換しているため、すべてがエラーである必要があります。

ケース1,2は大丈夫です!

どのようにすることができますか?

+8

これが言語の仕組みです。 Tour of Goや言語仕様の定数については相談してください。 257が1バイトオーバーフローすることを知って欲しい。 – Volker

+0

@Volkerはい、私は257がバイトをオーバーフローすることを知っています。ケース1,2 okは私を混乱させます – binbin

+1

コードのコメントは混乱しています。 4つはすべてオーバーフローですが、最後の2つはコンパイル時に検出されました(@Volkerが指すように、言語仕様を参照)。最初の2つ( 'rv1'と' rv2')も(実行時に)オーバーフローしますので、* ok *ではありません。 – putu

答えて

5

可変数値は通常の上位ビットの損失を伴いながら、より小さな型に変換できます。

コンパイラは定数値に対してこれを行うことを拒否します(これは常にエラーです)。これは、(私を強調する)required by the specある:

あらゆる実施しなければならない:

  • は、少なくとも256ビットの整数定数です。
  • 少なくとも256ビットの仮数および少なくとも16ビットの符号付き2進指数を持つ複素定数の部分を含む浮動小数点定数を表します。
  • 整数定数を正確に表現できない場合はエラーを返します。
  • オーバーフローによる浮動小数点または複素数定数を表すことができない場合は、エラーを返します。
  • 精度の限界により浮動小数点または複素数定数を表現できない場合は、最も近い表現可能な定数に丸めます。

これらの要件は、リテラル定数と定数式の評価結果の両方に適用されます。あなたはconst xconst yvar xvar yを変更した場合

したがって、あなたはすべての4例のためにエラーが発生します。

関連する問題