c中如何对浮点数进行位运算?如果不能,怎么读取浮点数二进制内容?

AQC学弟 2020-01-15 07:21:44
#include <stdlib.h>
#include <stdio.h>
double itobs(double n,char *ps)
{
double s=0;
int i;
int size=8*sizeof(double);
for(i=size-1;i>=0;i--,n>>=1)
{
s|=(1&n);
s>>=1;
}
return s;
}
int main(void)
{
double num;
char str[65];
scanf("%lf",&num);
itoa(itobs(num,str),str,16);
printf("%s",str);
return 0;
}

想通过如上方式改成内码的16进制,但是编译通不过,不能对double操作
...全文
516 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
AQC学弟 2020-01-16
  • 打赏
  • 举报
回复
错了,这样弄不成,兜兜转转还是要转换。 妙啊!
AQC学弟 2020-01-15
  • 打赏
  • 举报
回复
引用 4 楼 寻开心 的回复:
long long itobs(long long int n)
{
long long int s=0;
int i;
int size=8*sizeof(long long);
for(i=size-1;i>=0;i--,n>>=1)
{
s|=(1&n); // 这里s最多也就是1, 因为之前的s是0
s>>=1; // 再右侧移, 结果必然是0
}
printf("%lld\n",s);
return s;
}

没明白你这个函数要做什么

主函数里面
long long int t = *((long long int*)&num); 这样才是把num强制转换成long long
printf("%#llX", t); // 就可以直接输出16进制的long long类型


通过了


原来的思路是想通过位运算,把t的二进制数字复制到s中,把s中的数字弄到字符串里,用itoa。。。。不过貌似不能实现,itoa进的是十进制intger

这个是仿照c primer plus里的一个显示二进制的程序改编的,但是貌似这里好像用不了这么麻烦。。。。

我想实现以二进制形式的copy,虽然及其笨拙。。。但是我调试的时候,s的值有1啊。我觉得这个逻辑没问题。
寻开心 2020-01-15
  • 打赏
  • 举报
回复
long long itobs(long long int n)
{
long long int s=0;
int i;
int size=8*sizeof(long long);
for(i=size-1;i>=0;i--,n>>=1)
{
s|=(1&n); // 这里s最多也就是1, 因为之前的s是0
s>>=1; // 再右侧移, 结果必然是0
}
printf("%lld\n",s);
return s;
}

没明白你这个函数要做什么

主函数里面
long long int t = *((long long int*)&num); 这样才是把num强制转换成long long
printf("%#llX", t); // 就可以直接输出16进制的long long类型
AQC学弟 2020-01-15
  • 打赏
  • 举报
回复



引用 2 楼 寻开心 的回复:
double d = 123.456;
long long int t = (long long int *) &d;
然后把t按照位输出就行了

double是8位, float是4位
int 和 long int 在windows下都是 4位, long long int 才是8位

#include <stdlib.h>
#include <stdio.h>
long long itobs(long long int n)
{
long long int s=0;
int i;
int size=8*sizeof(long long);
for(i=size-1;i>=0;i--,n>>=1)
{
s|=(1&n);
s>>=1;
}
printf("%lld\n",s);
return s;
}
int main(void)
{
double num;
char str[65];
scanf("%lf",&num);
long long int t=(long long int)*#
itoa(itobs(t),str,16);
printf("%s",str);
return 0;
}

不知道怎么回事,这个t用longlong输出是0,调试的时候位操作有效,但这个好像只截了一部分
寻开心 2020-01-15
  • 打赏
  • 举报
回复
double d = 123.456;
long long int t = (long long int *) &d;
然后把t按照位输出就行了

double是8位, float是4位
int 和 long int 在windows下都是 4位, long long int 才是8位

AQC学弟 2020-01-15
  • 打赏
  • 举报
回复
源题
7-35 研究:双精度实数的机内码* (10分)

输入格式
十进制实数

输出格式
机内码(十六进制)

要求:十六进制机内码中的字母均为大写。

例如:实数 3.6 转换成二进制是 11.1001100110011001...,科学计数法记为:1.11001100110011001...×10^
​1
​​ ,因此 64 位的机内码为:0100000000001100110011001100110011001100110011001100110011001101,用十六进制书写则为:400CCCCCCCCCCCCD。

69,371

社区成员

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

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