在C语言下查看float数据类型在内存中的存储形式,遇到一个奇怪的问题。

l_xm 2015-04-12 08:18:15
代码如下:
#
include <stdio.h>
int main(void){
float f = 0.1;
char * p = (char *)(&f);
printf("%x %x %x %x",*(p + 3), *(p + 2), *(p + 1), *(p));
getchar();
return 0;
}

输出如下:

为什么后面三个十六进制数都有ffffff?
求解????
...全文
259 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
l_xm 2015-04-14
  • 打赏
  • 举报
回复
引用 2 楼 super_miker 的回复:
证明你使用的平台上char是signed char, 而printf函数要求的是unsigned int, 将signed char进行类型提升之后,如果char数值的最高位是1(>=0x80), 那么就会像前面的位填入1,否则就会在前面的位填入0. 如果你使用unsigned char,那么不管char的数值是多少,提升至unsigned int时只会在前面的位填入0.
谢谢解惑
l_xm 2015-04-14
  • 打赏
  • 举报
回复
引用 1 楼 enlinux 的回复:
这个需要知道浮点数的表达方式 浮点数 在 计算机中 表示为 1/2 + 1/4 + 1/8 + .... 0.1 = 1/16 + 1/32 + ... 然后,大多是是24.8 的精度,最后8bit就是00011000 %x 只是表达 32bit的值,实际表示的含义 由编译器决定
我预期是输出:3c cc cc cd
xiaohuh421 2015-04-13
  • 打赏
  • 举报
回复
请这样做 printf("%02x %02x %02x %02x", (BYTE)*(p + 3), (BYTE)*(p + 2), (BYTE)*(p + 1),(BYTE) *(p)); 格式化成16进制时, 一定要注意强制转换成无符号类型, 否则就会出现输出负数的情况(前面全是f). 因为x格式化, 认为是是要取4个字节的. 如果未强制转换, 那么push参数时就会按有符号类型的转换成4字节数据. 当然就会出现负数了.
707wk 2015-04-12
  • 打赏
  • 举报
回复
用unsigned char输出,原来我有个程序也是这种问题
苏叔叔 2015-04-12
  • 打赏
  • 举报
回复

int main(void)
{
	float f = 1.3f;
	printf("%p\n", &f);
	char *p1 = (char*)&f;
	printf("%x %x %x %x\n", p1[3], p1[2], p1[1], p1[0]);
	unsigned char *p2 = (unsigned char*)&f;
	printf("%x %x %x %x\n", p2[3], p2[2], p2[1], p2[0]);
	return 0;
}
//0035F848
//3f ffffffa6 66 66
//3f a6 66 66
super_miker 2015-04-12
  • 打赏
  • 举报
回复
证明你使用的平台上char是signed char, 而printf函数要求的是unsigned int, 将signed char进行类型提升之后,如果char数值的最高位是1(>=0x80), 那么就会像前面的位填入1,否则就会在前面的位填入0. 如果你使用unsigned char,那么不管char的数值是多少,提升至unsigned int时只会在前面的位填入0.
子善旬 2015-04-12
  • 打赏
  • 举报
回复
这个需要知道浮点数的表达方式 浮点数 在 计算机中 表示为 1/2 + 1/4 + 1/8 + .... 0.1 = 1/16 + 1/32 + ... 然后,大多是是24.8 的精度,最后8bit就是00011000 %x 只是表达 32bit的值,实际表示的含义 由编译器决定

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧