根据这个问题的答案:
E1 << E2的结果是E1左移E2位位置; 腾出的位用零填充.如果E1具有无符号类型,则结果的值为E1×2 E2,比结果类型中可表示的最大值减少一个模数.如果E1具有带符号类型和非负值,并且E1×2 E2可在结果类型中表示,那么这就是结果值; 否则,行为未定.
这似乎意味着1 << 31未定义.
1 << 31
但是,如果我使用,GCC不会发出警告1 << 31.它确实发出一个问题1 << 32. 链接
1 << 32
那是哪个呢?我误解了标准吗?海湾合作委员会有自己的解释吗?
c bit-shift undefined-behavior language-lawyer
我不明白不在 RAX 中传递参数有什么好处,因为返回值在 RAX 中,无论如何它都会被被调用者破坏。
有人可以解释一下吗?
x86-64 calling-convention
bit-shift ×1
c ×1
calling-convention ×1
language-lawyer ×1
undefined-behavior ×1
x86-64 ×1