2011-06-20 19 views
0

私はunsigned char vector mynumber[]があり、bigintを表しています。 この数値は正の値で、負の数に変換したいのですが。C番号バイト表現

私は私のベクトルを繰り返すが、私は1つを合計する必要があり、このように

for(int i = 0; i < dimvector;i++) 
mynumber[i] = ~mynumber[i]; 

を試してみました。 どのように合計ですか?

私はオーバーフローしている場合、どのように解決するのですか?

GMPで作業していますが、エクスポート後にベクターをSHA256に渡す必要があります。

最後に、import(GMP)を使用してBig numberでダイジェストの結果をトラストフォームします。

インポートでは、同じエクスポートの問題があります。 記号が重要です。

+0

あなたのコードは '〜mynumber [i]'式の結果を破棄しているので、実際には何もしません。 –

+0

私は悪いが、問題は別のものです。 – Gianluca

+3

近似で入力するのではなく、実際のコードをコピーして貼り付けるほうがよいでしょう。 –

答えて

2

Crikey。 GMPや他の図書館では、固定幅のフィールドを「四肢」または番号の一部として指定します。これまでのところ、レジスタを追加する場合はキャリーフラグをadcに設定するなど、レジスタと命令のサイズであるため、それぞれ32,64ビットプラットフォームでuint32_tまたはを使用する可能性が高いオーバーフローする。

とにかく、これらの手足は、その兆候ではなく、ビンガムの実際の大きさを表します。 2の補数を使用すると、どこかに符号ビットがあると予想されますが、数字をサイズ変更したい場合は乱雑になります(そして、adcは署名について気にしません。それを覚えて、それを正しい場所に戻す...非常に遅い。

私はあなたが各手足のビットを反転させることを達成しようとしているかどうか分かりません。あなたはあなたがで終わるだろう

1011 0111 1010 1011 = 47019 

(簡略化のために短い)、このような手足のセットを想像した場合:とにかく

0100 1000 0101 0100 = 18516 

を、GMPは、手足の兆候を示すものではありません。 _mp_sizeは、GMPは符号付きの数を表し方法です、あなたが見ることができるように

typedef struct 
{ 
    int _mp_alloc;  /* Number of *limbs* allocated and pointed 
          to by the _mp_d field. */ 
    int _mp_size;   /* abs(_mp_size) is the number of limbs the 
          last field points to. If _mp_size is 
          negative this is a negative number. */ 
    mp_limb_t *_mp_d;  /* Pointer to the limbs. */ 
} __mpz_struct; 
typedef __mpz_struct mpz_t[1]; 

:GMPにおける符号付き整数型には、この構造体によって定義されるmpz_tです。コードで

(具体的には、mpz/aors.h)あなたは、これが使用され表示されます:

usize = u->_mp_size; 
vsize = VARIATION v->_mp_size; 

// ..... 

if ((usize^vsize) < 0) 
{ 
    /* U and V have different sign. Need to compare them to determine 
which operand to subtract from which. */ 

    // does subtraction instead of add. 

実際の操作は、あなたの符号なしの型である関数のmpn_シリーズによって実行されています。

GMPには、サイズを正しく設定できるようにする基本的なタイプからいくつかのインポート/エクスポート機能があります。私はあなたが何をしようとしているのかよく分かっていませんが、彼らが不十分であると仮定して、あなた自身でそれを設定することができます。