$ cat main.c #include <stdio.h> union { float a; unsigned int b; } ex; struct float_32_format { unsigned int fraction: 23; /* 有效數位 */ unsigned int exp: 8; /* 指數位 */ unsigned int sign: 1; /* 符號位 */ }; /* 倒序表示 */ void analysis(float val) { struct float_32_format *format; printf("--- 開始分析浮點數 %f\n",val); ex.a=val; printf("-- 單精度浮點數存儲的4個位元組,10進位表示: %u\n",ex.b); printf("-- 單精度浮點數存儲的4個位元組,16進位表示: 0x%X\n",ex.b); /* 妙用union */ format=(struct float_32_format*)(&ex.a); /* ex.a或ex.b皆可 */ printf("-- sign: %u\n",format->sign); printf("-- exp: %u\n",format->exp); printf("-- fraction: %u ( 0x%X )\n",format->fraction,format->fraction); printf("\n"); } int main() { printf("'float' size: %d\n",sizeof(float)); printf("'unsigned int' size: %d\n\n",sizeof(unsigned int)); analysis(-20.25); return 0; } $ cat Makefile all: gcc main.c clean: rm -f a.out *~ $ ls main.c Makefile $ make gcc main.c $ ./a.out 'float' size: 4 'unsigned int' size: 4 --- 開始分析浮點數 -20.250000 -- 單精度浮點數存儲的4個位元組,10進位表示: 3248619520 -- 單精度浮點數存儲的4個位元組,16進位表示: 0xC1A20000 -- sign: 1 -- exp: 131 -- fraction: 2228224 ( 0x220000 ) $ |
C
[火星人 ] C語言,分析浮點數存儲格式已經有557次圍觀