簡體   English   中英

gmp 如何識別已簽名的 integer?

[英]How does gmp recognize a signed integer?

gmp 如何識別已簽名的 integer? 當我使用 gmp 庫時,我可以安全地將兩個大的正整數或無符號整數放入 mpz_tdiv_q () function 執行除法計算,但我很好奇當我使用 mp 將兩個 8 字節 ZCD69B4957F06CD818D7BF3D61980E291_Z 單元格轉換為 mpz_zroinit 時要轉換一個大的負整數,gmp如何將其識別為負數? 我可以放心把它放到mpz_tdiv_q中進行除法計算嗎?mpz_t里面的大integer是按照完整的存儲單元來存儲數字的。 例如,120 位將占用兩個連續的 64 位存儲單元。 如果此時是負數,是否需要擴展其有符號位,然后使用mpz_tdiv_q()進行除法計算?

    uint64_t ext_lhs[2];
    uint64_t ext_rhs[2];
    mpn_copyi(ext_lhs, lhs, 2);
    mpn_copyi(ext_rhs, rhs, 2);
    //sign bit expansion for the highest bit,Is it unnecessary?
    if(overwidth){
        svs_sext_to_bv64x_from_bv64x(ext_lhs, 2, width, lhs, 2 - 1, overwidth);
        svs_sext_to_bv64x_from_bv64x(ext_rhs, 2, width, rhs, 2 - 1, overwidth);
    }
    mpz_t res, left, right;
    mpz_init(res);
    mpz_tdiv_q(res, mpz_roinit_n(left, ext_lhs, 2), mpz_roinit_n(right, ext_rhs, 2));

mpz_roinit_nsize參數有 2 個用途。 它的絕對值編碼肢體的數量,而它的符號編碼結果數字的符號。 肢體數組始終對應一個正數,沒有符號位或 1/2-s 補碼。

uint64_t ext_lhs[2];
uint64_t ext_rhs[2];
mpn_copyi(ext_lhs, lhs, 2);
mpn_copyi(ext_rhs, rhs, 2);
mpz_t res, left, right;
mpz_init(res);
mpz_tdiv_q(res, mpz_roinit_n(left, ext_lhs, -2), mpz_roinit_n(right, ext_rhs, -2));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM