坑记-float、memcmp

本文探讨了在使用float时遇到的奇怪结果,以及在使用memcmp进行内存比较时需要注意的问题。文章指出,float乘以0.02f的结果可能不按预期,建议使用double。此外,memcmp可能导致补位区域的值不确定,除非确保所有相关操作都是赋值或memset,否则不应依赖memcmp进行判断。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

float

float source = 100.0f;
float result = source * 0.02f;
qDebug()<<(int)(source * 0.02f)<<source * 0.02f;
qDebug()<<(int)result<<result;

结果
1 2
2 2

很神奇的结果,source * 0.02f默认结果不是float类型还是其他什么地方有问题?还是默默用double的好

运行平台:Qt5.9.2-MinGW

memcmp

struct tempStruct {
    int n;
    bool f;
    double d;
};
int main(int argc, char *argv[]) {
    tempStruct a1{10,true,10.0};
    tempStruct a2 = a1;
    tempStruct a3;
    memset(&a3,0,sizeof(a1));
    a3.n=10;a3.f=true;a3.d=10.0;
    qDebug()<<memcmp(&a1,&a2,sizeof(a1));
    qDebug()<<memcmp(&a1,&a3,sizeof(a1));
    return 0;
}

结果

0
1
16 4 1 8

编译器自动补位对齐,所以memset以后是把a3内存所有值都改为0,然后将对应类型所在内存改为对应值,补位的区域还是0,而a1的补位区域是随机值。

若不能保证整个程序所有与此类型相关的操作都是赋值或memset,那就不要用memcmp判断。

 

 

Techie亮博客,转载请注明:Coologic » 坑记-float、memcmp

Coologic 博客域名已更改,已从 www.techieliang.com 改为 www.coologic.cn,上述链接地址受到影响,若需查看源文请手动修改,多有不便,敬请谅解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值