我有一个问题,
1U << 0 = 1
1U << 1 = 2
1U << 2 = 4
等......好吧..
例如;
1u<<1<<2
你能告诉我这个意思吗?
答案 0 :(得分:2)
由于<<
1 是左关联 2 ,这是
1U<<1<<2 = 2<<2 = 8U
1:Biwise shift left
2: associativity 表示应用表达式中具有相同优先级的运算符的顺序。
注意:对带符号的参数进行位移操作的结果给出了实现定义的结果,因此理论上1U<<x
比1<<x
更具可移植性
答案 1 :(得分:1)
运算符优先级规则指示如何解析在同一行上具有多个操作数的C表达式。这是C语言的一个混乱部分,因此operator precedence table是理解的有用工具。
在这种情况下,有两个<<
运算符具有相同的优先级,因此该组操作数的运算符关联性指示如何解析表达式。它对于移位运算符是从左到右的,这意味着表达式保证被解析为(1u<<1)<<2
。
换句话说,它与写1u << 3
完全相同。
u
后缀保证整数常量1是无符号类型。如果我们只输入1
,则此整数常量1的类型为int
,即signed
。这本来是不好的,因为对有符号整数类型执行移位操作可以调用各种未定义的行为(错误),因此应该始终避免。例如,1 << 31
是32位系统上的严重错误,而1u << 31
完全正常且安全。