我試圖理解下面的maxBit是什么,它代表什么?
當我打印最小值和最大值時,我得到的數字對我來說毫無意義。
Thank you.
#include <stdio.h>
#include <math.h>
int main() {
union {double a; size_t b;} u;
u.a = 12345;
size_t max = u.b;
u.a = 6;
size_t min = u.b;
int maxBit = floor(log(max-min) / log(2));
printf("%d",maxBit);
return 0;
}
這段代碼似乎使用了一個可怕的代碼。關于容忍使用編譯器擴展或其他超出C標準的代碼,我是這里比較受歡迎的參與者之一,但是這段代碼只是做一些不必要的事情,并沒有明顯的好處。它依賴于
size_t
是64位。在某些特定的C實現中,它可能是64位的,但這是不可移植的,使用64位的C實現通常是現代的,現代實現應該支持<stdint.h>
的uint64_t
,這是一種合適的類型。所以更好的代碼應該使用uint64_t
。除非代碼中存在一些令人驚訝的動機,否則它就是低質量的、糟糕的代碼。不要使用它,并對來自同一源代碼持懷疑態度。
也就是說,代碼可能假設IEEE-754二進制64用于
double
,而max-min
給出了12345和6的表示之間的區別。log(max-min) / log(2)
找到max-min
的base-two-logarithm,其整數部分將是更改的最高位的索引。對于12345,指數字段為140。對于6,指數字段為129。差值為11,其中第一位是字段的第3位(23=8)。該字段從第62位到第52位,因此指數字段中的第3位是表示的整個64位中的第55位。所以麥克斯比特就55歲了。然而,這并沒有明顯的意義。知道比特55是12345和6的表示之間的差異中的最高比特集合沒有什么大價值。我熟悉各種IEEE-754bit-twiddling黑客,我不認識這些。我希望沒有人能夠在沒有上下文的情況下告訴你更多關于這方面的信息,比如代碼來自何處或如何使用它。