C - 强制算术表达式的类型

时间:2018-02-25 10:41:44

标签: c

我有以下代码:

#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

2 个答案:

答案 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位宽。 在这种情况下,由于计算的输出已经溢出,因此无法生成