C#:変換できないからulongるバイト
-
22-08-2019 - |
質問
不思議などによって全然違いますので、C++、C#.
なんペーストの機能をC++、C#、マーク問題のあるラインのC#コードのコメント"//エラー.どの機能なエンコードのパラメータとして添加できるようになっているグローバル変数名byte1seeds.
これらの機能にはC++
//Global var:
unsigned char byte1seeds[3];
unsigned long GenerateValue( unsigned long * Ptr )
{
unsigned long val = *Ptr;
for( int i = 0; i < 32; i++ )
val = (((((((((((val >> 2)^val) >> 2)^val) >> 1)^val) >> 1)^val) >> 1)^val)&1)|((((val&1) << 31)|(val >> 1))&0xFFFFFFFE);
return ( *Ptr = val );
}
void SetupCountByte( unsigned long seed )
{
if( seed == 0 ) seed = 0x9ABFB3B6;
unsigned long mut = seed;
unsigned long mut1 = GenerateValue( &mut );
unsigned long mut2 = GenerateValue( &mut );
unsigned long mut3 = GenerateValue( &mut );
GenerateValue( &mut );
unsigned char byte1 = (mut&0xFF)^(mut3&0xFF);
unsigned char byte2 = (mut1&0xFF)^(mut2&0xFF);
if( !byte1 ) byte1 = 1;
if( !byte2 ) byte2 = 1;
byte1seeds[0] = byte1^byte2;
byte1seeds[1] = byte2;
byte1seeds[2] = byte1;
}
現在、C#のコード:
私の機能GenerateValue.ずにポインタのパラメータとして、ulongパラメータとします。
呼び出すと変更の両方の値を使ってい:
- ulong mut1=GenerateValue(mut);
- mut=mut1;
ここでは翻訳機能、問題となるラインについては,"//エラー");
//Global var:
public static byte[] byte1seeds = new byte[3];
public static ulong GenerateValue(ulong val)
{
for( int i = 0; i < 32; i++ )
val = (((((((((((val >> 2)^val) >> 2)^val) >> 1)^val) >> 1)^val) >> 1)^val)&1)|((((val&1) << 31)|(val >> 1))&0xFFFFFFFE);
return val ;
}
public static void SetupCountByte( uint seed )
{
if( seed == 0 ) seed = 0x9ABFB3B6;
ulong mut = seed;
ulong mut1 = GenerateValue(mut);
mut = mut1;
ulong mut2 = GenerateValue(mut);
mut = mut2;
ulong mut3 = GenerateValue(mut);
mut = mut3;
mut = GenerateValue(mut);
byte byte1 = (mut & 0xFF) ^ (mut3 & 0xFF); //error
byte byte2 = (mut1 & 0xFF) ^ (mut2 & 0xFF); //error
if( byte1 != 0 )
byte1 = 1;
if( byte2 != 0 )
byte2 = 1;
byte1seeds[0] = byte1^byte2; //error
byte1seeds[1] = byte2;
byte1seeds[2] = byte1;
}
のエラー:
できない暗黙的に変換型ulong'を'のバイト'.明示的な変換が存在する(ていき抜けるキャスト?)
編集における誤差の問題ライン3:
できない暗黙的に変換タイプ'int'を'のバイト'.明示的な変換が存在する(ていき抜けるキャスト?)
こちらの質問:を解消する為の方法についてその誤差は?
感謝。
解決
それを唱えるための(byte)
を追加します。あなたが精度を失う可能性があり、あなたはすなわち、値はバイトに収まるコンパイラに指示する必要があります。
byte byte1 = (byte)((mut & 0xFF) ^ (mut3 & 0xFF));
byte byte2 = (byte)((mut1 & 0xFF) ^ (mut2 & 0xFF));
他のヒント
あなたは情報を失う可能性があります。あなたが明示的にそうするように彼に指示しない限り、コンパイラは、この操作の種類を許可していません。したがって、このような何かをしようとします:
byte result = ((byte)mut & 0xFF) ^ ((byte)mut3 & 0xFF);
この方法では、すべての変数を明示的にキャストされ、結果はバイトになります。それとも、あなたがこれを行うことができます:
byte result = (byte)((mut & 0xFF) ^ (mut3 & 0xFF));
症状
次のコードは、C ++でコンパイルが、第三の線レポートタイプの非互換性と、C#コンパイラによって拒否されます。
ulong mut = 5;
ulong mut3 = 6;
byte foo = (mut & 0xFF) ^ (mut3 & 0xFF);
説明
発現(mut & 0xFF) ^ (mut3 & 0xFF)
は型ulong
であり、型byte
の変数に割り当てることができない。
変数mut
はulong
です。 &
のすべてのオーバーロードは、オペランドのタイプの対称性を必要とするので、表現(mut & 0xFF)
で、値0xFF
はulong
が促進され、操作の結果は、型ulong
を持っています。
ulong
を与えるんが、より大きな表現A ^ B
で、表現A
がタイプulong
を持っているという事実は、発現B
が促進される原因になるので、、これは偶発的である。
このように、発現(mut & 0xFF) ^ (mut3 & 0xFF)
は型ulong
であり、それは型byte
の変数に割り当てることができる前に、明示的なキャストを必要とする。
ソリューション
は、明示的に割り当てに先立って式全体を型キャスト
備考
ほとんどのC +ライブラリが欠陥だらけているので、人が代わりにそれらを考えるの警告をオフにします。あなたはあなたが得るに戻って警告を切り替えると非常に多く、それがどこか混乱で「潜在的に非可逆暗黙の型キャストが必要だった」の効果にメモがあるだろうにもかかわらず、それらを介して苦労しようとして役に立たないのです。
あなたがC#言語仕様を読めば、事業者に特に関連して、あなたは非常に多くの有益な事を学びます。。たとえば、このコードは失敗します。
byte b = 0xF0 | 0x0E; //b should contain 0xFE
が、これらは成功します:
byte b1 = (byte)(0xF0 | 0x0E); //typecast fixes it
byte b2 = 0xF0;
b2 |= 0x0E; //reflexive operator typed by target variable
「明示的な変換が存在し、」明示的なキャストを行う必要があることを示しています。この場合、それは次のようになります:
byte byte1 = (byte) ( (mut & 0xFF) ^ (mut3 & 0xFF) );
byte byte2 = (byte) ( (mut1 & 0xFF) ^ (mut2 & 0xFF) );
深さに明示的なダウンキャストの必要性を説明して MSDN Knowledge Baseの記事のがあります。エラーメッセージの「明示的な変換が存在する」という言葉は、あなたが明示的にキャストを使用してデータ型を変換する必要があり手がかりであることを意図しています。あなたの特定のケースでは、それは次のようになります:
byte byte1 = (byte) ( (mut & 0xFF) ^ (mut3 & 0xFF) );