关于C++中字节的具体定义,跪求啊!!!

慎独__ 2018-08-27 10:17:49

如图,我发送的是float类型的1.0,调试下面也显示1,但是我是定义了一个4字节的char发送出去的,
typedef union{
float f;
unsigned char a[4];
} float_t;
float_t t;
t.a[0]=0x00;
t.a[1]=0x00;
t.a[2]=0x40;
t.a[3]=0x40;
qDebug()<<t.f;
为什么这四个字节会是3,我是做TCP发送指令的,在客户端读取到的就是16进制00004040,但是3的16进制是00000033!
请问这之间有什么关系啊,一天了也没弄明白!!
...全文
629 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
翅膀又硬了 2018-08-29
  • 打赏
  • 举报
回复
以下代码可能有助于你理解

float f1 = 123.456;
float f2 = 0;
unsigned char buf[5] = {0};
memcpy(buf,&f1,4);
memcpy(&f2,buf,4);
棉猴 2018-08-28
  • 打赏
  • 举报
回复
单精度浮点float类型占4个字节,即4×8=32位。在32位二进制数中,包含了符号、指数和尾数三个部分,如图1所示。

请参考《C++浮点型变量的存储方式》
希望能够帮到你
赵4老师 2018-08-28
  • 打赏
  • 举报
回复
_肆 2018-08-28
  • 打赏
  • 举报
回复
没毛病
3F800000(H)=1.0(float)=1065353216(int)
40400000(H)=3.0(float)=1077936128(int)

3(int) =00000003(H)
3.0(float)=40400000(H)
看来你没接触过小数的十六进制表示啊,一般的编程书上只会说0.8125(D)=0.1101(B),但是不会告诉你计算机里没有小数点,只有0和1,所以对int的1和float的1.0用十六进制表示是不同的,也不知道书上为什么这么教
ipqtjmqj 2018-08-28
  • 打赏
  • 举报
回复
32位浮点数https://en.wikipedia.org/wiki/Single-precision_floating-point_format
其中0~22是去掉最高位1的系数部分,23~30是移码存储的指数,最高位是符号
4个字节从低到高为0x00,0x00,0x40,0x40,
则写成二进制从高位到低为:
0100 0000 0100 0000 0000 0000 0000 0000
红色部分为指数,为移码,转成原码减掉127,所以指数是1
符号位为0,表示正数
系数补1,即二进制的1.1
所以是1.1 *(2的1次方) = 1 * (2的1次方)+ 1*(2的0次方) = 3

sevancheng 2018-08-28
  • 打赏
  • 举报
回复
1.0 16 进制 3F800000 3.0 16进制40400000 没问题啊 参考IEEE 754
AlbertS 2018-08-28
  • 打赏
  • 举报
回复
浮点数的存储与整数不同,分为符号位,有效数字,指数位,参考浮点数

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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