對於char或整型,我可以這樣做:如何獲得C中雙精度的二進制數?
void print2(char c)//print char c in binary
{
for(int i=7;i>=0;i--)
if ((1<<i)&c) printf("1");
else printf("0");
}
但對於雙I不能使用運營商&。
我無法使用reinterpret_cast(它是C++)。
那麼,該怎麼做?
對於char或整型,我可以這樣做:如何獲得C中雙精度的二進制數?
void print2(char c)//print char c in binary
{
for(int i=7;i>=0;i--)
if ((1<<i)&c) printf("1");
else printf("0");
}
但對於雙I不能使用運營商&。
我無法使用reinterpret_cast(它是C++)。
那麼,該怎麼做?
樸素執行與memcpy()
,按費歇爾@Daniel的評論:
#include <stdio.h>
#include <string.h>
#include <limits.h>
void double_to_bits(double val);
int main(void)
{
unsigned idx;
double vals[] = { -1.0, 0.0, 1.0, 2.0 };
for (idx = 0; idx < 4; idx++) {
printf("\nvals[%u]= %+lf-->>", idx, vals[idx]);
double_to_bits(vals[idx]);
}
printf("\n");
return 0;
}
void double_to_bits(double val)
{
unsigned idx;
unsigned char arr[sizeof val];
memcpy (arr, &val, sizeof val);
for (idx=CHAR_BIT * sizeof val; idx-- ;) {
putc(
(arr[idx/CHAR_BIT] & (1u << (idx%CHAR_BIT)))
? '1'
: '0'
, stdout
);
}
}
,並用指針相同的(省略字符陣列和所述的memcpy)
void double_to_bits2(double val)
{
unsigned idx;
unsigned char *ptr = (unsigned char*) &val;
for (idx=CHAR_BIT * sizeof val; idx-- ;) {
putc(
(ptr[idx/CHAR_BIT] & (1u << (idx%CHAR_BIT)))
? '1'
: '0'
, stdout
);
}
}
創建字符指針並使其指向這個double。使用你的函數打印第一個sizeof(double)字符。
與union
而非memcpy
或pointer
A液:
void print2(double x)//print double x in binary
{
union {
double x;
char c[sizeof(double)];
} u;
assert(sizeof(char) == 1);
u.x = x;
for (unsigned ofs = 0; ofs < sizeof(double); ofs++) {
for(int i = 7; i >= 0; i--) {
printf(((1 << i) & u.c[ofs]) ? "1" : "0");
}
printf(" ");
}
}
LOL @'assert(sizeof(char)== 1);'無價! – wildplasser 2013-05-09 11:18:14
確實無價。那是什麼意思? – 2013-05-09 14:59:07
。假定一個double
具有64位,這重新解釋一個double x
的字節爲一個無符號的64位整數:
(union { double d; uint64_t u; }) {x} .u;
這是合法的C,其中double
的字節取決於實現。它定義了一個聯合的複合字面值,初始化與double
的聯合,並訪問uint64_t
成員。 C標準規定,當訪問最後存儲的成員以外的成員時,字節將被重新解釋爲新類型。
'它memcpy'到一個'unsigned char [sizeof(double)]'。 – 2013-05-09 10:47:54
@DanielFischer酷。 – Sayakiss 2013-05-09 10:48:47
memcpy?我從來不知道它。聽起來不錯。 @DanielFischer謝謝。 – Buddha 2013-05-09 10:56:36