Cod*_*ark 32 c++ unsigned sizeof
我对C++很新,但我发现这种auto奇怪的行为:
class A{};
int main() {
A a;
auto x = -(sizeof(a));
cout << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
unsigned在这种情况下,变量x 虽然我在变量的初始化时使用了一元减运算符.为什么只考虑sizeof(std::size_t)的返回类型而不是因为使用的运算符而存储的数字是否为负的事实?
我知道size_t是一个unsigned int.
我用GCC 8.1.0和C++ 17试过这个.
use*_*670 28
这里的实际问题是使用一元减运算符,就像其他内置算术运算符一样,是一个整体促销的主题.令人惊讶的是,应用一元减号的结果size_t仍然是,size_t并且没有必要责备auto.
相反的例子.在这种情况下,由于积分促销类型x将int如此输出将是-1:
unsigned short a{1};
auto x{-a};
cout << x << endl;
Run Code Online (Sandbox Code Playgroud)
Ste*_*ner 22
表达式-(sizeof(a))将一元运算-符应用于无符号类型的值.一元运算符不会将无符号整数值转换为有符号整数值; 它更确定哪个无符号值将是如下操作的结果(参见cppreference.com上的一元算术运算符):
内置的一元减运算符计算其提升的操作数的负数.对于无符号a,-a的值为2 ^ b -a,其中b是提升后的位数.
因此,即使它可能令人惊讶,也能auto正常工作,因为将一元运算-符应用于无符号值仍然是无符号值.
-应用于无符号值的(一元)结果为无符号,并sizeof返回无符号值。
一元运算符的操作数应具有算术或无作用域的枚举类型,其结果是其操作数的取反。积分提升是对整数或枚举操作数执行的。无符号数量的负数是通过从2 ^ n中减去其值来计算的,其中n是提升操作数中的位数。结果的类型是提升操作数的类型。
的结果
sizeof和sizeof...类型为一个恒定std?::?size_t
为避免实现定义的行为,您必须先转换为,int然后再应用-
如果目标类型是带符号的,则该值可以在目标类型中表示,则该值保持不变。否则,该值是实现定义的。
class A{};
int main() {
A a;
auto x = -(int{sizeof(a)});
cout << x << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)