2011-06-20 45 views
0

我有一個代表bigint的unsigned char vector mynumber[]。 這個數字是正數,我想將它轉換爲負數。C編號字節表示

我試圖以這種方式

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

我重複我的載體,但我需要總結的。 怎麼算一個?

如果我有溢出,該如何解決?

我使用GMP,導出後我必須將矢量傳遞給SHA256。

最後,我使用導入(GMP)在大數字中轉換摘要的結果。

在導入中我有導出問題。 標誌很重要。

+0

你的代碼實際上並沒有做任何事情,因爲你放棄了'〜mynumber [i]'表達式的結果。 –

+0

我寫得不好,但問題是另一個。 – Gianluca

+3

複製和粘貼實際代碼總是比較好,而不是輸入近似值。 –

回答

2

Crikey。好吧,首先,如何實現bignums:在GMP和其他庫中,通常您將固定寬度字段指定爲「肢體」或數字的一部分。到目前爲止,你已經有了這個部分,除了你更可能分別在32位和64位平臺上使用uint32_tuint64_t,因爲這些是寄存器和指令的大小,如adc設置進位標誌,如果增加兩個寄存器溢出。

無論如何,重要的是,這些肢體代表了bignum的實際量級,而不是它的符號。使用二進制補碼,我們希望在某個位置有一個符號位,但是如果您想調整一個數字的大小(並且adc不關心簽名,它只是執行二進制加法)會變得很亂,因爲您需要找到舊的符號位,提取它,記住它,然後將它放回到正確的位置...非常緩慢。

我不確定你想要實現的是顛倒每個肢體中的位。如果你想像一套四肢像這樣的(以下簡稱簡單)

1011 0111 1010 1011 = 47019 

你會結束:

0100 1000 0101 0100 = 18516 

反正GMP不代表四肢跡象。在GMP的符號整型是mpz_t這是由這個結構定義:

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]; 

因此,大家可以看到,_mp_size是GMP如何代表符號數。

在代碼中(具體而言,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有許多基本類型的導入/導出功能,可以讓您正確設置尺寸。我不太清楚你想要做什麼,但假設他們不足,你應該可以自己設定。