变量声明中的U后缀
U suffix in the variable declaration
我知道,如果数字后面跟着U后缀,它被视为无符号。但是为什么下面的程序打印变量i的正确值,即使它被初始化为负值。(编译gcc 4.9.2, 4.8.2, &4.7.1)
Program1.cpp
#include <iostream>
int main()
{
int i=-5U;
std::cout<<i; // prints -5 on gcc 4.9.2, 4.8.2, & 4.7.1
}
Program2.cpp
#include <iostream>
int main()
{
auto i=-5U;
std::cout<<i; // prints large positive number as output
}
但是如果我使用auto关键字(类型推断器新的c++ 0x功能),它会像预期的那样给我一个大的正数。
如果我理解不正确,请纠正我。
-5U不是-5 U
。是-(5U)
。负号是对5U
进行运算的负运算符,而不是整数字面值的第一个字符。
当您对一个无符号数取反时,相当于从2^n
中减去当前值,其中n
是整数类型的位数。这就解释了第二个程序。第一,当你把一个无符号整数到一个带符号整数(就像你在做通过分配到一个int
),如果该值为范围的结果是未定义的行为但总的来说*将导致被重新解释为一个无符号整数的值,因为无符号否定这样会有相同的行为作为两个补充签署了否定,结果都是一样的,如果发生在一个否定签署上下文。
。*注意:这不是那些"未定义的行为"的情况之一,只是学术关注的语言工作。编译器可以并且确实假设将无符号数转换为有符号数不会导致溢出(特别是当生成的整数随后在循环中使用时),并且已知这种假设的实例会将粗心编写的代码变成有问题的程序。
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 增量运算符与后缀混淆
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- C++:如何在"for"循环中动态地向文本行添加后缀以创建先前声明的变量
- 未声明运算符++后缀
- 变量声明中的U后缀