为什么是“unsigned int ui = {-1};”缩小转换误差?

2024-04-04

标准第 § 8.5.4/7 解释了什么是缩小转换范围 is:

缩小转换是隐式转换

— 从浮点类型到整数类型,或者

— 从 long double 到 double 或 float,或者从 double 到 float,除非源是常量 表达式与转换后的实际值在可以表示的值范围内 (即使无法准确表示),或

— 从整数类型或无作用域枚举类型到浮点类型,除非源 是一个常量表达式,转换后的实际值将适合目标类型,并且将 转换回原始类型时生成原始值,或者

— 从整数类型或无作用域枚举类型到不能表示所有的整数类型 原始类型的值,除非源是常量表达式以及之后的实际值 转换将适合目标类型,并在转换回原始值时生成原始值 原始类型。

然后它不允许在某些列表初始化上下文中进行此类转换,从而给出 例子:

[ 注意:如上所述,在列表初始化的顶层不允许进行此类转换。 - 结尾 注意] [示例:

int x = 999;        // x is not a constant expression
const int y = 999;
const int z = 99;
char c1 = x;    // OK, though it might narrow (in this case, it does narrow)
char c2{x};     // error: might narrow
char c3{y};     // error: narrows (assuming char is 8 bits)
char c4{z};     // OK: no narrowing needed
unsigned char uc1 = {5};    // OK: no narrowing needed
unsigned char uc2 = {-1};   // error: narrows
unsigned int ui1 = {-1};    // error: narrows
signed int si1 =
{ (unsigned int)-1 };   // error: narrows
int ii = {2.0};         // error: narrows
float f1 { x };         // error: might narrow
float f2 { 7 };         // OK: 7 can be exactly represented as a float
int f(int);
int a[] =
{ 2, f(2), f(2.0) }; // OK: the double-to-int conversion is not at the top level

—结束示例]

示例中所示的所有 7 个错误均由 铿锵 3.2/3.3 与-std=c++11, e.g.

error: non-constant-expression cannot be narrowed from type 'int' to 'char' in initializer list [-Wc++11-narrowing]

gcc 4.7.2/4.8.1 没有将它们报告为错误,但在每种情况下 给出了类似的警告,例如

warning: narrowing conversion of ‘x’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]

(因此海湾合作委员会似乎知道合规性要求,但选择容忍不合规性 默认情况下。)

我不明白的是这个例子是如何实现的:

unsigned int ui1 = {-1};    // error: narrows

有资格作为例子。 (同样地,对称si1示例。)显然 唯一的词语might合格的例子是第四个 和定义中的最后一项缩小转换范围上面给出;但 如果是这样,那么为什么这个例子没有通过限定条件来逃脱除非源是常量表达式并且之后的实际值 转换将适合目标类型,并在转换回原始值时生成原始值 原始类型?一定-1存在一个整数常量,如果转换为unsigned然后回来, 仍然产生int -1?

我缺少什么?


当然 -1 是一个整数常量,如果转换为无符号并返回,仍然会产生 int -1 吗?

这是错误的。如果将 -1 转换为unsigned你得到UINT_MAX。这很好,因为转换为无符号类型总是已定义的。然而,UINT_MAX不适合int只有当值适合目标类型时,标准才会定义到有符号类型的转换。

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

为什么是“unsigned int ui = {-1};”缩小转换误差? 的相关文章

  • 为什么纯虚拟析构函数的实现必须为空?它应该是内联的吗?

    我在其他线程中读到 当您实现纯虚拟析构函数 是的 它可以有一个实现 时 它必须是空的 并且应该 是内联的 应该是空的吗 如果是这样 为什么 应该内联吗 如果是这样 为什么 编辑 这就是纯虚拟析构函数的实现方式 class A virtual
  • Cocoa 常量名称中的“k”代表什么[重复]

    这个问题在这里已经有答案了 可能的重复 Apple 的 API 中的 k 前缀表示什么 https stackoverflow com questions 675816 what does the k prefix indicate in
  • 具有自动返回类型推导的 Friend 函数模板无法访问私有成员

    抱歉这个问题的标题太复杂了 我试图描述我为这个问题构建的最小 SSCCE 我有以下代码 include
  • 资源文件中的控制字符 C#

    我想添加Left To Right控制字符在resource resx文件输入Visual Studio 我在互联网上搜索并找到了一个名为在 NET 资源文件中转义序列的另一种方法 http www devx com tips Tip 34
  • 如何防止 Parallel.ForEach 循环在运行时更改任务数量?

    我正在使用Parallel ForEach循环做一些工作 我用localInit像这样 localInit gt new foo new Foo bars CreateBars 根据文档 https learn microsoft com
  • 使用 C 序列化 double 和 float

    如何在 C 中序列化双精度数和浮点数 我有以下用于序列化短整型 整数和字符的代码 unsigned char serialize char unsigned char buffer char value buffer 0 value ret
  • 改装和授权标头

    目前 我正在向我的请求添加授权标头 如下所示 文件 SomeFile cs public interface ITestApi Get api test id Task
  • 更改 Json 中属性的键

    这些天我正在尝试制作一个 json 编辑器 与树视图一起使用 我确实更改了值函数 我也可以更改一些键 但我无法在对象中设置键 我可以设置值 SetValue ref JObject main JToken token JToken newV
  • 清除指针向量[重复]

    这个问题在这里已经有答案了 假设我定义了一个这样的类 class foo private std vector lt int gt v public void bar1 for int i 0 i lt 10 i int a new int
  • 即使在不活动状态下,Hangfire 也会继续运行 SQL 查询

    我正在开发一个 ASP net MVC 5 网站 并使用 Hangfire 来安排一些任务 在本例中每 3 分钟一次 我知道一个事实是 运行这样的任务 以及与之相关的数据库查询 只需要几秒钟 我面临的问题是 Hangfire 似乎让我的 S
  • llvm clang 编译器上的dynamic_cast失败

    我看到一个奇怪的失败dynamic cast正在返回NULL在 clang 编译器上 但相同的代码可以在 gcc 环境下运行 您能否指出根本原因是什么 之间可能有什么区别dynamic cast关于 llvm 和 gcc 我正在使用两个编译
  • 从 Windows 选择声音并播放它们

    我有一个 WinForms 应用程序 该应用程序有一个 首选项 部分 用户可以在其中选择显示警报时播放哪些声音 是否可以有一个组合框 用户可以从 Windows 存储的声音中进行选择 例如 紧急停止 紧急蜂鸣 等 这些可以在 控制面板 gt
  • 在多个线程中添加和删除时 List 中的 null 值

    我知道 C System Collections Generic List 对象不是线程安全的 但我想知道为什么这段代码会生成空值 Task Run gt for var i 0 i lt 10 i var str Test i list
  • boost::bind 会导致开销吗?

    我目前正在从事网络软件方面的工作 它有一个主要类 server这显然代表一个服务器实例 A server实例可以发送请求 并通过回调通知用户响应 代码如下 class server public typedef boost function
  • 访问控制器类中的 appsettings.json 值

    无法弄清楚如何读取startup cs之外的appsettings json值 例如 我想做的是在 Layout cshtml 中 从配置中添加站点名称 例如 ViewData SiteName Configuration GetValue
  • 如何打开 Outlook 已接收和阅读电子邮件

    我们有 5 个人 使用同一封电子邮件通过 Outlook 回复客户 我想设计一个程序来打开所有已发送的电子邮件 阅读它们 打开它们 找到第一个人的签名 并在他 她的计数器中添加一个数字 以便我可以得出一些统计数据 关于如何打开 Outloo
  • 成员函数的Decltype

    class A int f int x int j return 2 decltype f p 给我错误 error decltype cannot resolve address of overloaded function 我不明白为什
  • 如何在mvc视图中的表中显示数据库数据

    在我的 MVC 应用程序中 我从数据库检索数据 我想在表格中显示退役数据 控制器代码 public ActionResult MyAccount var user User Identity Name string sThumbnails
  • 类型与创建 CLR 存储过程不匹配

    我在程序集中有一个如下所示的方法 namespace MyNameSpace public class MyClass Microsoft SqlServer Server SqlProcedure public static void M
  • 如何用纯色填充位图?

    我需要使用唯一的 RGB 颜色创建 24 位位图 分辨率 100x100 像素 并将生成的图像保存到磁盘 我目前使用的是SetPixel http msdn microsoft com en us library 6c7eyzyb aspx

随机推荐

  • 在 GitHub 上显示 pdf 差异

    有没有办法显示两个版本的 pdf 或 doc odf 文件之间的差异 提交信息 现在我只能下载它的任何版本 查看原始 按钮 PDF DOC 和 ODF 文件是二进制格式 不包含纯文本 Git 并不真正支持人类可读的二进制文件差异 它可以生成
  • 使用 IIS ApplicationInitialization remapManagedRequestsTo 功能时返回用于提供静态 html 的自定义响应代码?

    我目前正在使用应用程序初始化 https learn microsoft com en us iis configuration system webserver applicationinitialization IIS 的功能来预热我的
  • 检查对象是数字还是布尔值

    设计一个等价于以下语句的逻辑表达式 x是一个包含三个或五个元素的列表 其中第二个元素是 字符串 Hip 其中第一个不是数字或布尔值 我拥有的 x Head Hip 10 print x 1 is Hip 我的问题 如何检查它是布尔值还是数字
  • 在 MySQL 服务启动时运行 SQL 查询

    我在 mysql 上创建了 HEAP ram 表以加快查询速度 但是mysql服务器重新启动后 我的堆表中的数据没有加载 我的正常表名 productsid 产品名称 状态为 myisam id gt 整数和自动增量 主键 产品名称 gt
  • 检票口:带有 ListView 的 FileUploadField

    我有一个用于上传多个文件的页面 对于每个文件 用户必须指定类型和描述 这就是为什么我不能使用MultiFileUploadField 所以我用RepeatingView with a FileUploadField在每个元素以及我需要的其他
  • python scikit-learn 缺失数据聚类

    我想对缺少列的数据进行聚类 手动执行此操作 我将在没有此列的情况下计算缺少列的距离 使用 scikit learn 不可能出现丢失数据的情况 也没有机会指定用户距离函数 是否有机会对缺失数据进行聚类 示例数据 n samples 1500
  • 如何立即触发timer.Elapsed事件

    我正在使用System Timers Timer类来创建一个计时器Timer Elapsed事件 事情是Timer Elapsed仅在间隔时间过去后才会首次触发事件 有没有办法提高Timer Elapsed启动计时器后立即发生事件 我在中找
  • 有没有办法在 Jenkins 构建队列小部件中显示更多信息?

    在詹金斯状态页面上 我们有以下小部件 它显示 主 作业挂起 5 次 这是合理的 因为每次将代码审查推送到 Gerrit 时 它都会触发该分支上的这些更改的作业 如果我将鼠标悬停在这些 主 链接上 我可以看到环境中的许多有用信息 例如 GER
  • Android Oreo 位置通过 JobIntentService 在后台更新

    我曾经有AlarmManager WakefulBroadcastReceiver 服务做一些后台代码并获取位置更新 从奥利奥开始 这已被弃用 所以现在我使用AlarmManager BroadcastReceiver JobIntentS
  • main() 是 C 中的预定义函数吗? [复制]

    这个问题在这里已经有答案了 可能的重复 C C Java C 中的 main https stackoverflow com questions 1539385 main in c c java c 总的来说 我对编程很陌生 尤其是 C 我
  • 如何以编程方式调用 Maven 依赖插件

    我正在尝试以编程方式调用 maven dependency plugin 我正在使用 Maven 3 版本 问题是 当我通过pluginManager executeMojo session execution 调用它时 我收到以下错误消息
  • 使用 json.net 反序列化静态属性?

    大家好 我有一个如下所示的 JSON totals tokenType string tokenDenomination double count int IDCode string Key string 反序列化为对象的 C 代码是 in
  • 使用 WooCommerce 中的挂钩更新产品价格

    我正在尝试使用元键更新产品正常价格 regular price当产品在 wp admin 中更新时 使用整数或字符串 我想要的用户流程是 打开产品编辑页面 单击更新按钮 页面重新加载后 请看到 regular price 设置为 20 ad
  • 无法从 Windows 调试 Web 应用程序中的 iOS 问题?

    我在 iPad Pro 和 iPhone 7 Plus 上测试 Web 应用程序时发现了一些错误 我无法使用 Windows 或 Android 中的任何浏览器复制这些错误 并且找不到任何在 Windows 中远程调试 Safari 的方法
  • 如何迭代 C# 类查找特定类型的所有实例,然后在每个实例上调用方法

    是否可以 通过反射 迭代对象的所有字段 并在每个字段上调用一个方法 我有一堂课是这样的 public class Overlay public Control control1 public Control control2 我想要一个像这
  • 自动映射器表达式必须解析为顶级成员

    我正在使用自动映射器来映射源对象和目标对象 当我映射它们时 我收到以下错误 表达式必须解析为顶级成员 参数名称 lambda表达式 我无法解决这个问题 我的源对象和目标对象是 public partial class Source priv
  • C 删除文件最后 n 个字符

    我需要使用 C 代码从文件中删除最后 n 个字符 起初我尝试使用 b 但它返回了分段错误 我看到类似问题的有趣答案here https stackoverflow com questions 584639 truncate file and
  • 把按钮做成圆形

    我正在尝试在 150 210 的 x y 坐标处制作 JButton 圆 我希望按钮是大小为 40 40 的椭圆形 按钮的背景颜色为红色 它不需要文本 所以我应该得到一个我想要的任何大小的按钮 对吗 我正在使用面板 并将 setLayout
  • jQuery Mobile 通过 ajax 动态创建可折叠集不应用样式[重复]

    这个问题在这里已经有答案了 可能的重复 动态添加可折叠元素 https stackoverflow com questions 4214538 dynamically adding collapsible elements 我正在动态创建一
  • 为什么是“unsigned int ui = {-1};”缩小转换误差?

    标准第 8 5 4 7 解释了什么是缩小转换范围 is 缩小转换是隐式转换 从浮点类型到整数类型 或者 从 long double 到 double 或 float 或者从 double 到 float 除非源是常量 表达式与转换后的实际值