我有以下代码:
#include <stdio.h>
int main() {
long long int x = 4294967296;
long long int y = 2^32; // 4294967296
printf("%lld \n", x);
printf("%lld \n", y);
}
输出:
4294967296
34
这是一个人为的例子,但我如何强制算术表达式更广泛?我试过像
这样的东西(2LL)^(32LL)
但不起作用。 我在64位Ubuntu上用gcc编译。
//编辑
显然我是一个菜鸟,并没有意识到^不是指数运算符,而是按位异或......我现在可耻地回到学习C
答案 0 :(得分:1)
正如其他人所指出的,^
在大多数语言中都是独占或。
计算2的整数次幂的最佳方法是使用位移,而不是浮点pow
,因为你可能会失去精度(对于其他数字的幂,也有很好的算法:The most efficient way to implement an integer based power function pow(int, int))
但为此你必须确保结果不会溢出。
#include <stdio.h>
int main()
{
long long int y = 1LL<<32;
printf("%lld\n",y);
}
此处的另一个陷阱是,如果不使用1
前缀,则无法将LL
移位32次,否则会在分配给long long
之前发生溢出(请参阅{ {3}})除非int
类型是64位。我不会赌它,大多数编译器都会警告你溢出。
答案 1 :(得分:1)
首先,你得到的结果是正确的,因为你实际上正在对值进行异或
第二,至少在你的情况下你可以将输出移动32但在这种情况下你需要确保你要移动的值至少是64位长以防止溢出因此你必须使用类似的东西:
unsigned long long test = 1LLU << 32;
注意LLU
,其中'2'基元在移位前设置为至少64位宽。
在这种情况下,由于计算的输出已经溢出,因此无法生成