float 是 32 位 浮点数
double 是 64 位 浮点数
浮点数的字节内容可以用 union 破解:
union {
float x
unsigned char s[4]
} F32
F32.x = 1.23456
for (i=0i<4i++) printf("%x",F32.s[i])
16进制1位拉4位,得 2进制内容。
union {
double y
unsigned char t[8]
} F64
F64.y = 1.23456
for (i=0i<8i++) printf("%x",F64.t[i])
16进制1位拉4位,得 2进制内容。
/* $begin show-bytes */#include <stdio.h>
typedef unsigned char *byte_pointer
void show_bytes(byte_pointer start, int len)
{
int i
//原来的代码 for (i = 0 i < len i++)
for (i = len-1 i >=0 i--)
{
printf(" %.2x", start[i])
}
printf("\n")
}
void show_int(int x)
{
float oneFloat
oneFloat=(float)x
show_bytes((byte_pointer) &oneFloat, sizeof(float))
//原来的代码show_bytes((byte_pointer) &x, sizeof(int))
}
void show_float(float x)
{
show_bytes((byte_pointer) &x, sizeof(float))
}
void show_pointer(void *x)
{
show_bytes((byte_pointer) &x, sizeof(void *))
}
/* $end show-bytes */
/* $begin test-show-bytes */
void test_show_bytes(int val)
{
int ival = val
float fval = (float) ival
int *pval = &ival
show_int(ival)
show_float(fval)
show_pointer(pval)
}
/* $end test-show-bytes */
void simple_show()
{
/* $begin simple-show */
int val = 0x12345678
byte_pointer valp = (byte_pointer) &val
show_bytes(valp, 1) /* A. */
show_bytes(valp, 2) /* B. */
show_bytes(valp, 3) /* C. */
/* $end simple-show */
}
void float_eg()
{
/* $begin float-show */
int x = 3490593
float f = (float) x
show_int(x)
show_float(f)
/* $end float-show */
}
void string_eg()
{
/* $begin show-string */
char *s = "ABCDEF"
show_bytes(s, strlen(s))
/* $end show-string */
}
void show_twocomp()
{
/* $begin show-twocomp */
short int x = 12345
short int mx = -x
show_bytes((byte_pointer) &x, sizeof(short int))
show_bytes((byte_pointer) &mx, sizeof(short int))
/* $end show-twocomp */
}
int main(int argc, char *argv[])
{
//十进制数520的十六进制数是00000208H,
//正确的32位浮点是44020000H,内存从低位开始放置00 00 02 44
//十进制数100的十六进制数是00000064H,
//正确的32位浮点是42C80000H,内存从低位开始放置00 00 C8 42
int num
printf("Input one integer:")
scanf("%d",&num)
printf("\n")
show_int(num) //十进制整数转换为32位浮点
printf("\n")
return 0
}
c语言中单精度数和双精度数的本质区别在于数据类型所占的内存字节,浮点数,在C语言中使用的是IEEE754浮点数编码,该标准规定了单精度浮点数和双精度浮点数所占的内存字节,一般单精度数占用4个字节,双精度数占用8个字节,扩展双精度数占用80个字节。IEEE754具体的标准如下:格式 长度 符号位 指数位 尾数位 有效位数 指数偏移 尾数说明
单精度 32 1 8 23 24127 有一位隐含位
双精度 64 1 11 52 53 1023 有一位隐含位
扩展双精度 80 1 15 64 64 16383 没有隐含位