16

WinFormsを使用してVS2008.net3.5のコードに従う必要があります。

byte percent = 70;
byte zero = 0;

Bitmap copy = (Bitmap)image1.Clone();
...

Color oColor = copy.GetPixel(x, y);
byte oR = (byte)(oColor.R - percent < zero ? zero : oColor.R - percent);

コードの最後の行から「(byte)」を外すと、「タイプ' int'を''に暗黙的に変換できません」というコンパイラエラーが発生しますbyte。すべてが型bytebyte整数型の場合...なぜキャストが必要なのですか?

4

9 に答える 9

16

減算は整数まで強制しているからです。私が思い出したように、byteはC#の符号なし型であるため、減算によってバイトのドメインから外れる可能性があります。

于 2009-05-29T18:19:28.930 に答える
11

これは、バイト減算の結果がバイトに収まらないためです。

byte - byte = (0..255) - (0..255) = -255..255
于 2009-05-29T18:20:43.497 に答える
8

バイトの算術演算は、デフォルトでint値になります。

于 2009-05-29T18:18:49.617 に答える
4

バイトの算術演算はデフォルトで整数を返すため、2つの可能な割り当てのうち、より狭いタイプのゼロ(バイト)がint(oColor.rのそれ-パーセント)にプロモートされます。したがって、操作のタイプはintです。コンパイラは、キャストがないと、損失の多い操作であるため、幅の広い型を幅の狭い型に割り当てることはできません。したがって、キャストで「データが失われていることはわかっていますが、問題ありません」と明示的に言わない限り、エラーが発生します。

于 2009-05-29T18:19:19.133 に答える
2

これは、byte減算が。を返すためintです。実際には、上の2進算術演算はbytesを返すintため、キャストが必要です。

于 2009-05-29T18:18:34.627 に答える
2

sbyte、byte、ushort、およびshortの算術演算は、自動的にintに変換されるためです。これの最も妥当な理由は、そのような操作がオーバーフローまたはアンダーフローする可能性があることです。

したがって、三項演算では、最終的なoColor.R-パーセントは、実際にはバイトではなく整数になります。したがって、操作の戻り型はintです。

于 2009-05-29T18:24:27.763 に答える
1

代入演算子の右辺の算術式は、デフォルトでintと評価されるためです。この例では、percentデフォルトでint。詳細については、MSDNページを参照してください。

于 2009-05-29T18:24:05.567 に答える
1

このC#コードを実行してみてください:object o =(byte)(1); o =(int)o; 何を期待しますか?今試してみてください:)

私はこれが正しいと思います:

Eric Lippertは、「バイトを「数字」とは考えていません。数字、文字、色などとして解釈できるビットのパターンと考えています。数学を行う場合は、それらを数値として扱い、結果をより一般的に数値として解釈されるデータ型に移動することは理にかなっています。」

おそらく、byteはintよりもcharに近いでしょう。

于 2009-07-04T00:39:20.807 に答える
0

FWIW、javaもバイトをintにプロモートします。

于 2009-06-02T20:19:15.707 に答える