簡體   English   中英

問題將雙范圍數字轉換為二進制

[英]issue convert double range number to binary

我在將整數類型的雙精度數字轉換為二進制時遇到問題,如下所示:

void intToBin(int digit) {
    int b;
    int k = 0;
    char *bits;
    int i;

    bits= (char *) malloc(sizeof(char));
    while (digit) {
        b = digit % 2;
        digit = digit / 2;
        bits[k] = b;
        k++;
    }
    for ( i = k - 1; i >= 0; i--) {
        printf("%d", bits[i]);
    }
}

但是正如您所看到的,該函數的參數輸入是整數。

我嘗試使用intToBin(10329216702565230)時遇到錯誤,因為10329216702565230超出整數范圍。

如何將具有整數類型的double rage number的值擴展為二進制?

更新

我更新了以下代碼

void intToBin(uint64_t digit) {
    int b;
    int k = 0;
    char *bits;
    int i;

    bits = malloc(sizeof digit * 64);

    while (digit) {
        b = digit % 2;
        digit = digit / 2;
        bits[k] = b;
        k++;
    }
    for ( i = k - 1; i >= 0; i--) {
        printf("%d", bits[i]);
    }

}

但是我不知道該怎么做才能得到2的補碼? 丹寧

解決方案是使用支持該數字范圍的類型。

使用unsigned long longuint64_t (假設您要傳遞非負整數,否則使用long longint64_t )。 然后,您可以調用類似Edited的函數,以從發布的注釋中將int64_t添加到uint64_t unsigned long long是至少64位-甚至可以更寬。 隨着OP評論獲得64位輸出-更好地使用(u)int64_t

intToBin(10329216702565230U)

如果您想使用負數,請使用long long像這樣intToBin(10329216702565230L)

您沒有分配足夠的內存-您正在訪問尚未分配的內存,從而導致Undefined behavior 您先分配了1個char ,然后又沒有分配。 您可以通過重新分配來解決此問題-在循環內部重新分配內存(在循環內部一次重新分配1 char )。 然后使用它。 與其多次調用realloc ,不如不為64 char分配內存,然后使用它來存儲結果。 最后,可以通過另一個realloc調用釋放剩余的空間。

您不需要malloc轉換malloc的返回值( void*char*轉換是隱式完成的)。 您沒有檢查malloc的返回值。 malloc可能返回NULL ,在這種情況下,您必須單獨處理它。 例如:-

   #define NBITS 64
   ...
   ...
   bits = malloc(NBITS);
   if( bits == NULL ){
       perror("malloc failed");
       exit(EXIT_FAILURE);
   }

注意:引入64幻數的想法是, unsigned long long至少為64位。 因此,在轉換時,如果位數超過64我們將使用它進行重新分配。 更好的選擇是使用chux所說的sizeof digit * CHAR_BIT

bits[k] = b+'0';

我們輸入ascii值,然后可以像這樣打印它

printf("%c", bits[i]);

您忘記釋放分配的內存。 如果不釋放它( free(bits) ),則會發生內存泄漏。

達維奇·蘭金斯評論

void intToBin(int digit)
{
int b;
int k = 0;
char *bits;
int i;

bits= (char *) malloc(sizeof(char));
while (digit) {
    b = digit % 2;
    digit = digit / 2;
    bits[k] = b;
    k++;
}
for ( i = k - 1; i >= 0; i--) {
    printf("%d", bits[i]);
}
}

答案很簡單,

將int替換為int64_t以使用64位而不是32位。請嘗試並告知我們

int替換為int64_t以使用64位而不是32位。

暫無
暫無

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

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