Tag: 一元运算符

一元减去0x80000000(有符号和无符号)

n3337.pdf草案5.3.1.8规定: 一元运算符的操作数应具有算术或无范围的枚举类型,结果是其操作数的否定。 对整数或枚举操作数执行整体提升。 无符号数量的负数是通过从2ⁿ减去其值来计算的,其中n是提升操作数中的位数。 结果的类型是提升的操作数的类型。 在某些情况下,这就足够了。 假设unsigned int是32位宽,那么(-(0x80000000u)) == 0x80000000u ,不是吗? 尽管如此,我找不到关于无符号0x80000000上的一元减号的任何内容。 此外,C99标准草案n1336.pdf,6.5.3.3似乎没有提及: 一元运算符的结果是其(提升的)操作数的否定。 整数提升在操作数上执行,结果具有提升类型。 UPDATE2:我们假设unsigned int是32位宽。 所以,问题是:C中的一元减号(有符号和无符号),以及C ++中的一元减号(仅限签名)? UPDATE1:运行时行为和编译时行为(即常量折叠)都很有趣。 (相关: 为什么是abs(0x80000000)== 0x80000000? )

一元减号和浮点数转换的组合

考虑以下C语句: unsigned long x = 1; float a = -x; double b = -x; 我希望一元减项产生一个等于ULONG_MAX的无符号长值,a和b分别设置为ULONG_MAX的单精度和双精度表示。 这是我在32位Linux上使用gcc 4.4.7以及在64位Linux上使用Intel和PGI编译器获得的结果。 但是,对于64位Linux上的gcc(测试版本4.4.7,4.7.2和4.8.0,都带有-O0和-O2),双变量b具有预期值,但float a等于-1代替。 相比之下,以下语句将在我测试的所有编译器和系统上将a和b设置为ULONG_MAX的浮点表示: unsigned long x = 1; unsigned long y = -x; float a = y; double b = y; 如果我使用unsigned int而不是unsigned long,我也会在所有系统上得到预期的结果。 这是某种未定义的行为还是编译器错误?

一元+运算符会进行类型转换吗?

直到现在我才相信没有使用一元+算子。 但后来我遇到了以下例子: char ch; short sh; int i; printf(“%d %d %d”,sizeof(ch),sizeof(sh),sizeof(i)); // output: 1 2 4 printf(“%d %d %d”,sizeof(+ch),sizeof(+sh),sizeof(i)); // output: 4 4 4 这是否意味着+正在进行类型转换? 因为它的行为与以下相同 printf(“%d %d %d”,sizeof((int)ch),sizeof((int)sh),sizeof(i)); // output: 4 4 4 这迫使我认为+正在进行类型转换。 但后来我尝试double double f; printf(“%d %d”,sizeof(+f),sizeof((int)f),sizeof(f)); // output: 8 4 8 这迫使我重新考虑一元+算子。 所以我的第二个问题是:一元+运算符在sizeof运算符中有特殊效果吗?

单个语句中的多个增量运算符

可能重复: 未定义的行为和序列点 请解释以下陈述的行为 int b=3; cout<<b++*++b<<endl; 它将如何计算?