使用 gcc 将 C 中的 float 转换为 unsigned int

2024-01-06

我正在使用 gcc 来测试 float 到 unsigned int 之间的一些简单转换。

下面这段代码给出的结果是 0。

const float maxFloat = 4294967295.0;
unsigned int a = (unsigned int) maxFloat;
printf("%u\n", a);

0 被打印(我认为这很奇怪)。

另一方面,以下代码:

const float maxFloat = 4294967295.0;
unsigned int a = (unsigned int) (signed int) maxFloat;
printf("%u\n", a);

打印 2147483648 我相信这是正确的结果。

如果我得到 2 个不同的结果会发生什么?


如果你首先这样做:

printf("%f\n", maxFloat);

您将得到的输出是这样的:

4294967296.000000

假设一个float被实现为 IEEE754 单精度浮点类型,值 4294967295.0 无法用此类型精确表示,因为没有足够的精度位。最接近的值can商店是 4294967296.0。

假设一个int(同样地unsigned int) 是 32 位,值 4294967296.0 超出了这两种类型的范围。当值无法用给定整数类型表示时,将浮点类型转换为整数类型调用未定义的行为 https://en.wikipedia.org/wiki/Undefined_behavior.

这在第 6.3.1.4 节中有详细介绍。C标准 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf这规定了从浮点类型到整数类型的转换:

1 When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.61)

...

61) 整数类型值时执行的余数运算 当值为以下时,无需执行转换为无符号类型 实浮点类型转换为无符号类型。因此,范围为 可移植的实浮点值为(−1, Utype_MAX+1)。

上述段落中的脚注引用了第 6.3.1.3 节,其中详细介绍了整数到整数的转换:

1当一个整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新的值表示 类型,它没有改变。

2否则,如果新类型是无符号的,则通过重复加或减 1 来转换该值。 可以用新类型表示,直到该值在以下范围内 新类型。

3否则,新类型是有符号的,并且该值无法在其中表示;结果要么是实现定义的,要么是 引发实现定义的信号。

您在第一个代码片段中看到的行为与到无符号类型的超出范围转换一致当相关值是整数时,但是因为要转换的值具有浮点类型,所以这是未定义的行为。

仅仅因为一种实现做到了这一点并不意味着所有实现都会这样做。事实上,如果更改优化设置,gcc 会给出不同的结果。

例如,在我使用 gcc 5.4.0 的机器上,给出以下代码:

float n = 4294967296;
printf("n=%f\n", n);
unsigned int a = (unsigned int) n;
int b = (signed int) n;
unsigned int c = (unsigned int) (signed int) n;
printf("a=%u\n", a);
printf("b=%d\n", b);
printf("c=%u\n", c);

我使用 -O0 得到以下结果:

n=4294967296.000000
a=0
b=-2147483648
c=2147483648

和 -O1 一起使用:

n=4294967296.000000
a=4294967295
b=2147483647
c=2147483647

如果另一方面n定义为long or long long,你总是会得到这样的输出:

n=4294967296
a=0
b=0
c=0

如上所述,到无符号的转换由 C 标准明确定义,而到有符号的转换是实现定义的,其中海湾合作委员会定义 https://gcc.gnu.org/onlinedocs/gcc/Integers-implementation.html如下:

当值无法在对象中表示时,将整数转换为有符号整数类型的结果或引发的信号 该类型(C90 6.2.1.2、C99 和 C11 6.3.1.3)。

为了转换为宽度 N 的类型,该值会减少模 2^N 在该类型的范围内;没有发出任何信号。

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

使用 gcc 将 C 中的 float 转换为 unsigned int 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 调用 McAfee 病毒扫描引擎

    我收到客户的请求 要求使用他们服务器上的 McAfee 病毒扫描将病毒扫描集成到应用程序中 我做了一些调查 发现 McScan32 dll 是主要的扫描引擎 它导出各种看起来有用的函数 我还发现提到了 McAfee Scan Engine
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 类型中的属性名称必须是唯一的

    我正在使用 Entity Framework 5 并且有以下实体 public class User public Int32 Id get set public String Username get set public virtual
  • 机器Epsilon精度差异

    我正在尝试计算 C 中双精度数和浮点数的机器 epsilon 值 作为学校作业的一部分 我在 Windows 7 64 位中使用 Cygwin 代码如下 include
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • free 和 malloc 在 C 中如何工作?

    我试图弄清楚如果我尝试 从中间 释放指针会发生什么 例如 看下面的代码 char ptr char malloc 10 sizeof char for char i 0 i lt 10 i ptr i i 10 ptr ptr ptr pt
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 如何使从 C# 调用的 C(P/invoke)代码“线程安全”

    我有一些简单的 C 代码 它使用单个全局变量 显然这不是线程安全的 所以当我使用 P invoke 从 C 中的多个线程调用它时 事情就搞砸了 如何为每个线程单独导入此函数 或使其线程安全 我尝试声明变量 declspec thread 但
  • WcfSvcHost 的跨域异常

    对于另一个跨域问题 我深表歉意 我一整天都在与这个问题作斗争 现在已经到了沸腾的地步 我有一个 Silverlight 应用程序项目 SLApp1 一个用于托管 Silverlight SLApp1 Web 的 Web 项目和 WCF 项目
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 编译时展开 for 循环内的模板参数?

    维基百科 here http en wikipedia org wiki Template metaprogramming Compile time code optimization 给出了 for 循环的编译时展开 我想知道我们是否可以
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • 为什么C++代码执行速度比java慢?

    我最近用 Java 编写了一个计算密集型算法 然后将其翻译为 C 令我惊讶的是 C 的执行速度要慢得多 我现在已经编写了一个更短的 Java 测试程序和一个相应的 C 程序 见下文 我的原始代码具有大量数组访问功能 测试代码也是如此 C 的
  • C++ 中的参考文献

    我偶尔会在 StackOverflow 上看到代码 询问一些涉及函数的重载歧义 例如 void foo int param 我的问题是 为什么会出现这种情况 或者更确切地说 你什么时候会有 对参考的参考 这与普通的旧参考有何不同 我从未在现
  • MySQL Connector C/C API - 使用特殊字符进行查询

    我是一个 C 程序 我有一个接受域名参数的函数 void db domains query char name 使用 mysql query 我测试数据库中是否存在域名 如果不是这种情况 我插入新域名 char query 400 spri
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么

随机推荐

  • leetcode:使用链表将两个数字相加

    我正在尝试解决涉及链表的中级问题之一 它是这样的 给您两个表示两个非负整数的非空链表 这些数字以相反的顺序存储 并且每个节点都包含一个数字 将两个数字相加并以链表形式返回总和 您可以假设这两个数字不包含任何前导零 除了数字 0 本身 蟒蛇代
  • 不剪辑内容的剪辑路径

    我正在尝试使用剪辑路径创建形状背景 但我不想剪辑该 div 的子项 内容 这是代码 div webkit clip path polygon 0 57 100 21 100 100 0 100 clip path polygon 0 57
  • sonarRunner 权限不足错误

    我在运行声纳时遇到权限不足的错误 在我将 sonarQube 升级到 5 0 后 这种情况开始发生 错误 声纳运行程序执行期间出错 错误 无法执行声纳 错误 原因 无法装饰 org sonar api resources File 152f
  • 无法建立 SSL/TLS 安全通道的信任关系:根据验证过程,远程证书无效

    我有一个 ASP NET MVC Web 应用程序 它已经在生产环境中运行了大约 4 年 从大约一周前开始 我突然发现对第 3 方安全 API 的所有调用都返回此错误 System Net WebException 底层连接已关闭 可以 不
  • 如何仅使用 DOM 将所有元素上的一个类替换为另一个类?

    我只想将一个类名更改为另一个类名 我尝试过使用 document getElementsByClassName current setAttribute class none 但它不起作用 我是 JavaScript 新手 解释 docum
  • 关闭并重新打开 Realm 实例是否会影响性能?

    使用 SQLite 时 我通常每个应用程序都有一个 SQLiteOpenHelper 实例 并且我从不关闭它 因为它的数据库被许多其他类连续使用 关闭 重新打开它会更慢 更复杂 现在我正在研究 Realm 并且计划仅从数据访问对象访问 Re
  • 无法使用 php pdo 从数据库返回正确的行数

    我试图从数据库中的表返回行计数 但仍然得到错误的值 我需要行计数来处理分页的子集值 我的表中有 11 项 但我只返回 1 项并且不明白为什么 我的外部连接文件 try pdo new PDO mysql host localhost dbn
  • 比较两个 Joda-Time DateTime 对象

    我正在处理的事情与这里所问的非常相似 比较 Joda Time 时区 https stackoverflow com questions 15165788 compare joda time zones 15165833 noredirec
  • 对我的应用程序的大小感到困惑?

    我对我的应用程序的大小有点困惑 该文件夹和所有内容的大小为 25 9MB 在 Xcode 中存档后 它显示 估计 App Store 大小 49 8MB 有人知道这是为什么吗 Thanks 您是否正在为armv6和armv7进行编译 如果您
  • CSS 边框内的边框

    在 的帮助下CSS 三角形教程 http css tricks com snippets css css triangle 我学会了创建三角形 arrow down width 0 height 0 border left 20px sol
  • PostgreSQL - 使用子查询更新多个列值

    我需要能够使用子查询的结果更新表上的多个列 一个简单的例子如下所示 UPDATE table1 SET col1 col2 SELECT MIN ship charge MAX ship charge FROM orders WHERE c
  • 在 ASP.NET 中隐藏文本框

    我正在使用 ASP NET 3 5 和 C 在我的页面上 我需要有一个文本框 该文本框必须对用户不可见 但当您查看页面源代码时它必须在那里 原因是 另一个名为 Eloqua 的程序将查看页面源代码 并且它必须获取该文本框的值 该文本框的值将
  • 如何调用辅助构造函数中的方法?

    class foo val x Int def convertToInt z string do somthing to convert a string to an integer def this y string this conve
  • Java:如何从泛型类型获取类文字?

    通常 我见过人们像这样使用类文字 Class
  • AutoEventWireUp 页面属性是什么意思?

    我不明白什么是AutoEventWireUppage属性负责 我已读完本文 http support microsoft com kb 324151 但即便如此我也不明白 当请求页面时 它会引发各种事件 这些事件被视为其一部分生命周期 ht
  • 使用网络摄像头拍照给出黑色输出[Unity3D]

    我在 Stackoverflow 问题中使用了 Bart 给出的代码我可以使用设备的相机在 Unity 中拍照吗 https stackoverflow com questions 24496438 can i take a photo i
  • Asp.Net 5 中的 ADO.Net

    当我在 ASP Net 5 应用程序中使用连接字符串生成器时 出现以下错误 错误 CS0012 类型 DbConnectionStringBuilder 是在 未引用的程序集 您必须添加对程序集的引用 System Data 版本 4 0
  • 在哪里可以找到 Microsoft.Office.Interop.Word.dll (2010)?

    我获得了我正在尝试编译的 NET 项目的源代码 尽管如此 该项目使用了 Office 2010 中的引用 命名空间 Microsoft Office Interop Word 但我在任何地方都找不到 我能够下载该文件microsoft of
  • MySQL #1243 给 EXECUTE 的未知预准备语句处理程序 (stmt)

    我正在关注这个tutorial http buysql com mysql 14 how to automate pivot tables html在我安装的 MySQL 版本上 但它抛出一个错误 SET sql NULL SELECT G
  • 使用 gcc 将 C 中的 float 转换为 unsigned int

    我正在使用 gcc 来测试 float 到 unsigned int 之间的一些简单转换 下面这段代码给出的结果是 0 const float maxFloat 4294967295 0 unsigned int a unsigned in