質問

不思議などによって全然違いますので、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パラメータとします。

呼び出すと変更の両方の値を使ってい:

  1. ulong mut1=GenerateValue(mut);
  2. 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の変数に割り当てることができない。

変数mutulongです。 &のすべてのオーバーロードは、オペランドのタイプの対称性を必要とするので、表現(mut & 0xFF)で、値0xFFulongが促進され、操作の結果は、型ulongを持っています。

同様のプロセスは、第2の部分式に型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) );
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top