c - 输入数字的正确方法是什么?
问题描述
以下程序是否定义良好或会导致未定义的行为?
#include <assert.h>
#include <stdio.h>
int main(void)
{
float x, y;
int i;
assert(sizeof (x) == sizeof (i));
x = 3.14;
i = *(int *) &x;
y = *(float *) &i;
printf("%f %f\n", x, y);
return 0;
}
如果它会导致未定义的行为,是否有另一种方法可以在不更改值的位模式的情况下将浮点值的类型更改为整数类型?
编辑:
我要实现的是一个类似于
#define CONV(T, n) ((T) (n))
但这不会改变 n 的位模式。
解决方案
float
是的,通过int*
指针访问数据是未定义的行为(它违反了严格的别名)。
进行类型双关的标准方法是写memcpy(&i, &x, sizeof(i))
而不是i = *(int*)&x
.
这是一个很好的资源:什么是严格别名以及我们为什么关心
推荐阅读
- laravel - 无法删除我想要的记录,只有第一个
- java - Lint 在组装发布目标时发现了一个致命错误
- angular - 如何在 Angular 6 中处理 API 令牌
- performance - 快速排序 Vs。归并排序性能分析
- opencv - 如何将在图像上绘制的画笔绘图保存为opencv中的填充和单独的二进制掩码?
- google-apps-script - 从命名表中获取 ID
- php - PhpWord 罗马数字表示页码
- javascript - 如何向此 jquery 脚本添加更多 div 类?
- php - 子域路由 laravel 5.4
- php - MySQL:无线电检查插入具有多行的数据库