如何将浮点数转换或转换为其位序列,例如长整型

2023-11-26

再会, 我在 16 位 C 环境中工作,我想将浮点值转换为其位序列,例如整数值。 我知道有多种方法可以实现这一目标,一种是通过工会;另一种是通过工会。例如:

union ConvertFloatToInt
{  
   float input;  
   unsigned long  output;  
};

这将通过读取相同的内存区域,将浮点值“转换”为长值,只是以不同的方式解释它。

union ConvertFloatToInt x;
x.input = 20.00;

result

x.output = 0x41A00000;

其他方法是 void 指针强制转换...

float input = 40.00;
unsigned long output;
void* ptr;
ptr = &input;
output = *(unsigned long*) ptr;

result

output = 0x42200000;

这是我想要做的想法,但是,我希望编译器在构建期间而不是运行时为我进行转换。

我需要将转换后的浮点数据插入到常量(const)无符号长整型中。

我正在考虑尝试将 float 值转换为 void,然后将 void 转换为 unsigned long。 像这样的东西:(是的,这是不正确的,你不能将其转换为空)

const unsigned long FloatValue = (unsigned long) ((void) ((float) 20.654));

有什么方法可以做到这一点吗?我在想也许有 void 指针,但我知道的所有 void 指针都需要一个变量,并且变量可能不能在 const 值的赋值中使用。

Edit

我使用的是 C90 编译器。 该问题是在文件范围内提出的。

结论

结论是,除了在块作用域中工作之外,这个问题没有真正的解决方案。对此大家给出了多个答案,我感谢大家。

我的解决方案

这不是一个好的解决方案,但是它解决了我的问题,但我认为这也不会帮助很多人。 我创建了一个小程序用于演示目的。这不是我的项目代码,也不是我的项目中使用的编译器(之前有人说这不是 C90 编译器)

演示使用的编译器:gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

typedef union
{
            float myfloat;
            unsigned long mylong;
} custom_type;

typedef struct
{
            int a;
            int b;
            custom_type typeA;
            custom_type typeB;
} my_struct;

const my_struct myobj =
{
                            1,2,3.84F,4
};

int main(void)
{
            printf(":: %f\n", myobj.typeA.myfloat);
            printf(":: %ul\n", myobj.typeA.mylong);
            return 0;
}

Output

:: 3.840000
:: 1081459343l

这有点粗糙,但是它在文件范围内有效(但会生成警告)。


您可以通过匿名联合进行类型双关来做到这一点:

unsigned int i = ((union { float f; unsigned int i; }){5.0}).i;

请注意,此初始化程序不是常量表达式,因此不能在文件范围内使用。

脚注中的标准指定允许通过联合进行类型双关:

c11

6.5.2.3 结构和联合成员

95) 如果用于读取联合对象内容的成员与上次用于读取内容的成员不同 在对象中存储一个值,该值的对象表示的适当部分被重新解释 作为新类型中的对象表示,如 6.2.6 中所述(这个过程有时称为“type 双关语”)。这可能是一个陷阱表示。

从实际角度来看,虽然您不能使用此方法来初始化文件范围常量,但您可以编写一个初始化函数,在程序或模块初始化时将值加载到文件范围变量中。

您不会找到允许您将值计算为编译时常量表达式的可移植方法,因为标准第 6.2.6 节涵盖的对象表示仅适用于运行时。否则,需要交叉编译器simulate而不仅仅是参数化其目标的执行环境。


附录:这个is有效的 C++,条件是union类型必须命名为:

union u { float f; unsigned int i; };
unsigned int i = u{5.0}.i;

因此,如果您愿意使用混合 C/C++ 编写并使用 C++ 编译器进行编译,那么您可以在编译时执行转换。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何将浮点数转换或转换为其位序列,例如长整型 的相关文章

  • 全局变量不好

    好吧 读完这篇文章和一些示例后 我仍然不清楚全局变量的含义 那么你的类中的私有变量是全局的吗 http www c2 com cgi wiki GlobalVariablesAreBad http www c2 com cgi wiki G
  • 如何获取枚举数作为常量?

    From 枚举中定义的项目总数 https stackoverflow com questions 856154 total number of items defined in an enum 我发现我可以使用以下方法获取枚举数 Enum
  • MVVM:来自 FileOpenPicker 的图像绑定源

    我将 OnActivated 添加到 app xaml cs 中 它可以正常工作 protected async override void OnActivated IActivatedEventArgs args var continua
  • 处理器关联组 C#

    我使用的是 72 核的 Windows Server 2016 我看到有两组处理器 我的 net 应用程序将使用一个或其他组 我需要能够强制我的应用程序使用我选择的组 我看到下面的代码示例 但我无法使其工作 我可能传递了错误的变量 我希望应
  • 使用 C 的另一个结构内的灵活长度结构数组

    你好 我正在尝试使用 C 来实现一个简单的结构 2 个盒子 每个盒子包含不同数量的颗粒 main 中传递的粒子的确切数量 我写了以下代码 typedef struct Particle float x float y float vx fl
  • 有关shared_ptr的竞态条件示例

    为什么没有竞争条件代码片段 https godbolt org z nEYPYqdqK below include
  • 图片框、双击和单击事件

    我有一个奇怪的问题 我有一个图片框双击事件以及单击事件 问题是即使我双击该控件 也会引发单击事件 如果我禁用单击事件 则双击事件正在工作 这个问题已经在这里讨论过 https stackoverflow com questions 1830
  • 如何在单例类和未命名类之间进行选择?

    我会使用这样的单例 Singleton single Singleton instance single gt do it 我会使用这样的未命名类 single do it 我觉得单例模式除了具有可读的错误消息之外 与未命名的类相比没有任何
  • C++:避免​​在重载中将字符串自动转换为布尔值

    我想创建一组方法 这些方法将根据其类型输出具有特殊格式的值 当我这样做时 到目前为止看起来还不错 static void printValue std ostringstream out int value out lt lt value
  • 仅使用一个 #include 表达式一次包含多个头文件?

    是否有任何表达式可以使语法一次包含多个标头 而无需为每个新文件编写 include 表达式 例如 include
  • 如何在 C++11 中返回类成员向量

    我读了几篇关于如何从方法返回向量的文章 其中包括 c11 右值和移动语义混淆返回语句 https stackoverflow com questions 4986673 c11 rvalues and move semantics conf
  • 将 JavaScript 引擎嵌入到 .NET 中 [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 只是想知道是否有人尝试过将任何 js 引擎嵌入并实际集成到 net 环境中 我可以找到并实际使用 经过L
  • 来自同一基模板类的 C++ 重写函数,具有多重继承不明确的函数调用

    我需要打电话init int iNumber 从基类派生的函数 基类 h pragma once include stdafx h template
  • Qt 多重继承和信号

    由于 QObject 我在 QT 中遇到了有关多重继承的问题 我知道很多人也有同样的问题 但我不知道该如何解决 class NavigatableItem public QObject Q OBJECT signals void desel
  • 批量插入,asp.net

    我需要获取与会员相对应的 ID 号列表 在任何给定时间处理的数量可能在 10 到 10 000 之间 我可以毫无问题地收集数据 解析数据并将其加载到 DataTable 或任何内容 C 中 但我想在数据库中执行一些操作 将所有这些数据插入表
  • 如何通过分解 y 轴来减小 mschart 的高度

    如何降低 mschart 的高度 如下所示 编辑 就我而言 我不想查看中断图表 this chart1 ChartAreas 0 AxisY ScaleBreakStyle Enabled false 您似乎正在寻找AxisY ScaleB
  • Qt - 添加超链接到对话框

    有没有办法在 Qt 对话框中添加可点击的超链接 IE 它应该看起来像一个超链接 蓝色文本 当您单击它时 它应该在浏览器中打开该超链接 像这样的东西 Use QLabel setOpenExternalLinks bool 并在标签上设置文本
  • 以编程方式阻止 Vista 桌面搜索 (WORDS) 对映射网络驱动器上的 pst 文件建立索引

    经过几天的多次尝试 我没有找到任何 100 的解决方案来解决这个问题 我的搜寻和调查范围 直接访问注册表 HKLM SOFTWARE Microsoft Windows Search CrawlScopeManager Windows Sy
  • 使用属性和性能

    我正在优化我的代码 我注意到使用属性 甚至自动属性 对执行时间有深远的影响 请参阅下面的示例 Test public void GetterVsField PropertyTest propertyTest new PropertyTest
  • 在派生类中访问基类变量

    class Program static void Main string args baseClass obj new baseClass obj intF 5 obj intS 4 child obj1 new child Consol

随机推荐

  • 解构mongodb查询结果返回的对象

    假设我们启动一个 mongodb 查询语句 如下所示 const user await db users findOne console log user 结果很好 id 5f60647c28b90939d0e5fb24 tenantId
  • Firebase 3x 方法不适用于真实设备,但适用于模拟器 Swift 3.0

    我们正在使用 Google Firebase 3 x 版本 但我们遇到了来自 Firebase 的奇怪问题 我们使用 Swift 3 0 为了获取用户详细信息 我们使用以下代码片段 func getUserDetails uid text
  • 龙卷风中可以并发吗?

    我知道龙卷风是一个单线程和非阻塞服务器 因此请求是按顺序处理的 除非使用事件驱动方法进行 IO 操作 有没有办法在tornado中并行处理多个请求以进行正常 非IO 执行 我无法分叉多个进程 因为我需要跨请求的公共内存空间 如果不可能 请向
  • 如何以独立模式更轻松地将我的 Jar 部署到 Spark 集群?

    我有一个包含 3 台机器的小型集群 还有另一台用于开发和测试的机器 开发的时候我设置了SparkContext to local 当一切正常后 我想将我构建的 Jar 文件部署到每个节点 基本上我手动将这个 jar 移动到集群并复制到集群共
  • Angular 6 + Spring Boot:错误:“来自原点‘http://localhost:4200’已被 CORS 策略阻止”

    我正在尝试将 Angular 6 项目与 Spring Boot 应用程序连接 当我运行 Angular 项目时 尽管我已经安装了所有依赖项和导入 但它不断出现此错误 我在控制器类中使用了以下代码行 CrossOrigin 起源 http
  • Rails 3 路由堆栈级别设计太深

    我收到有关我的路线文件的错误 SystemStackError stack level too deep actionpack 3 2 8 lib action dispatch middleware reloader rb 70 Rend
  • 使用jQuery隐藏div滚动条,但保留滚动?

    我试图能够在一个 div 内滚动 但不显示实际的滚动条 我需要用户能够使用滚轮滚动 有人对我如何实现这一目标有想法吗 Thanks 好吧 真正的原因是你想要这个 但既然你问了 我会尽力解决你的问题 你将需要两个 div 一个嵌套在另一个里面
  • 将 Color 作为字符串(如 #XXXXXX)转换为 System.Windows.Media.Brush 的最简单方法

    我觉得标题已经说得很清楚了 我现在拥有的是 System Drawing Color uiui System Drawing ColorTranslator FromHtml myString var intColor uint uiui
  • 使用 Unicode 数据加载FromFile

    我的输入文件 f 有一些无法正确读取的Unicode 瑞典语 这些方法都不起作用 尽管它们给出了不同的结果 LoadFromFile f or LoadFromFile f TEncoding GetEncoding GetOEMCP 我正
  • 在Python中查找列表中所有单词的字符数

    我试图找到单词列表中的字符总数 特别是这个列表 words alpha omega up down over under purple red blue green 我尝试过这样做 print The size of the words i
  • 以编程方式禁用应用程序中的屏幕截图

    我想防止在应用程序中截取页面的屏幕截图 如何以编程方式执行此操作 以便无法截取屏幕截图 找到检测屏幕截图的代码 截图后可以立即删除吗 let mainQueue NSOperationQueue mainQueue NSNotificati
  • Eclipse 不会让我的应用程序运行

    我正在尝试在手机上安装我制作的应用程序 但我不断收到错误 Installation error INSTALL PARSE FAILED NO CERTIFICATES 我正在使用 Eclipse 我以前从未见过这个问题 我已经在手机上运行
  • 使用附加文件在 YARN 集群上运行 Spark 作业

    我正在编写一个简单的 Spark 应用程序 它使用一些输入 RDD 通过管道将其发送到外部脚本 并将该脚本的输出写入文件 驱动程序代码如下所示 val input args 0 val scriptPath args 1 val outpu
  • 如何从状态数组中删除一个项目?

    故事是 我应该能够把鲍勃 莎莉和杰克放进一个盒子里 我也可以从盒子中取出其中一个 移除后 不会留下任何插槽 people Bob Sally Jack 我现在需要删除 Bob 新的数组将是 Sally Jack 这是我的反应组件 getIn
  • 在 Go 中升级到 TLS 的连接

    我有一个打开的 TCP 连接 并使用 for 循环从中读取内容 如下所示 for tx Text is of type textproto Conn the underlying connection is stored in tx Con
  • Python 字符串末尾有空格和无空格以及不变性

    我了解到在一些不可变的类中 new 可能会返回一个现有的实例 这就是int str and tuple类型有时适用于小值 但为什么以下两个片段的行为不同呢 末尾有一个空格 gt gt gt a string gt gt gt b strin
  • 如何在 Excel 2007 中从 VBA 访问复选框

    添加复选框时 如何从 VBA 访问该值 在 Excel 2007 中 在开发人员功能区上 插入 表单控件 复选框 将复选框重命名为 chkMyCheck 将宏添加到复选框 我现在有带有 chkMyCheck Clicked 的 Module
  • 超出 UIView 范围的交互

    当 UIButton 的框架位于其父级框架之外时 UIButton 或任何其他控件 是否可以接收触摸事件 因为当我尝试这个时 我的 UIButton 似乎无法接收任何事件 我该如何解决这个问题 是的 您可以覆盖hitTest withEve
  • 在 iOS 中处理不同的 URL 方案(Facebook 和 Instagram)

    我什至不知道如何定义这个问题 但它就是这样 我有一个使用 Facebook SDK 进行用户登录的应用程序 我按照 Facebook 授权教程进行操作 我不是 100 确定它是如何工作的 但这部分在我的 AppDelegate m 中似乎很
  • 如何将浮点数转换或转换为其位序列,例如长整型

    再会 我在 16 位 C 环境中工作 我想将浮点值转换为其位序列 例如整数值 我知道有多种方法可以实现这一目标 一种是通过工会 另一种是通过工会 例如 union ConvertFloatToInt float input unsigned