[英]convert double number to (IEEE 754) 64-bit binary string representation in c++
[英]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 long
或uint64_t
(假設您要傳遞非負整數,否則使用long long
或int64_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.