0

位运算符从来都不是我的强项。我想知道在使用位移时何时需要显式强制转换。

例如,只要是无符号整数类型,例如、等,就i&1 == i%2保证为真?我认为问题是in是否被隐式转换为 width 类型。icharunsigneduint64_t1i&1sizeof(i)

作为第二个示例,如果我执行 a i = 1<<myshift,我是否需要首先将 显式1转换为足够宽以存储移位结果的数据类型,例如:i = (uint64_t)1<<myshift

第二个示例中的类型是否myshift无关紧要,只要它是无符号的?


我认为这些问题的答案是肯定的,肯定的,肯定的。特别是第二个例子可以快速检查。但是有人对这些东西有很好的参考吗?来自 C 标准的链接/引用将非常有帮助。

4

1 回答 1

2

1 是的。奇数位是最不重要的 - 在“1”中打开的那个,无论您选择什么表示。

根据标准

约束

2 每个操作数应为整数类型。

语义

3 对操作数执行通常的算术转换。

4 二元 & 运算符的结果是操作数的按位与(即,当且仅当设置了转换操作数中的每个相应位时,结果中的每个位都被设置)。”。

2 是的,如果您需要多于sizeof(int)字节(可能是 4),则必须这样做。

3 是的。又是标准:

约束

2 每个操作数应为整数类型。

语义

3 对每个操作数执行整数提升。结果的类型是提升的左操作数的类型。如果右操作数的值为负数或大于或等于提升的左操作数的宽度,则行为未定义。

4 E1 << E2的结果是E1左移E2位;空出的位用零填充。如果 E1 具有无符号类型,则结果的值为 E1*2^E2,以比结果类型中可表示的最大值多一个模数减少。如果 E1 具有带符号类型和非负值,并且 E1*2^E2 在结果类型中是可表示的,那么这就是结果值;否则,行为未定义。

于 2013-05-24T02:46:41.050 回答