首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么“无符号int ={-1}”是缩小转换错误?

为什么“无符号int ={-1}”是缩小转换错误?
EN

Stack Overflow用户
提问于 2013-07-09 14:59:23
回答 1查看 3.7K关注 0票数 4

“标准”第8.5.4/7号编解释了缩小转换的含义:

缩窄转换是隐式转换。 -从浮点数类型到整数类型,或 -从长双到双或浮动,或从双到浮动,除非源是一个常量表达式,转换后的实际值在可以表示的值范围内(即使不能准确表示),或 -从整数类型或非作用域枚举类型到浮点类型,除非源是常量表达式,转换后的实际值将符合目标类型,并在转换回原始类型时生成原始值,或 -从整数类型或非作用域枚举类型到不能表示原始类型所有值的整数类型,除非源是常量表达式,转换后的实际值将符合目标类型,并在转换回原始类型时生成原始值。

然后,它不允许在某些列表初始化上下文中进行这种转换,并举例说明:

注意:如上所述,在列表初始化的顶层不允许这种转换.-尾注示例:

代码语言:javascript
复制
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个错误都是用-std=c++11的clang3.2/3.3来报告的。

代码语言:javascript
复制
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没有将这些错误报告为错误,但在每种情况下都发出了类似的警告。

代码语言:javascript
复制
warning: narrowing conversion of ‘x’ from ‘int’ to ‘char’ inside { } [-Wnarrowing]

(因此gcc似乎知道合规要求是什么,但默认情况下却选择容忍不遵守规定。)

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

代码语言:javascript
复制
unsigned int ui1 = {-1};    // error: narrows

可以作为一个例子。(对称的si1示例也是如此。)显然,它可以作为示例的唯一单词是上文给出的缩窄转换定义中第四项和最后一项的单词;但如果是,那么为什么该示例不通过限定逃避,除非源是一个常量表达式,而转换后的实际值将符合目标类型,并在转换回原始类型时产生原始值?当然,-1有一个整数常量,如果转换为unsigned和back,仍然会产生int -1

我遗漏了什么?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-09 15:01:57

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

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

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17551583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档