C++:按变量值而不是数字移位 ->有什么区别?
C++: Shift by variable value instead of number -> whats the difference?
int value = 0xffffffff;
int len = 32;
int result = value << len; // result will be 0xffffffff
result = value << 32; // result will be 0x0
为什么会有所不同?
编辑:对不起,我犯了一个错误。在上面的示例中,两个结果都0xffffffff。所以看看这个:
unsigned int value = 0xffffffff;
unsigned int len = 32;
printf("0x%xn", value << len); //will print 0xffffffff
printf("0x%xn", 0xffffffff << 32); //will print 0x0
如果int
的大小为 32 位或更小,则代码包含未定义的行为。 位数移位必须大于或等于 0,且严格小于正在移动的内容中的位数。
在实践中可能发生的情况是,对于变量,编译器可能只是将其传递给机器仅考虑 5 个低阶位(即32 的情况下为 0);当班次计数为常量时,编译器在内部计算表达式(可能在long
long
中),然后截断它。 但这只是一种可能行为;就语言而言,任何事情都可能发生关心。
如果len >= sizeof(int)
或len < 0
,代码包含未定义的行为。
有关更多详细信息,请参阅此答案。
相关文章:
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- C++ - "!pointer"和"pointer == nullptr"的区别?
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 在 .h 文件中的类中声明静态变量和在.cpp文件中声明"global"变量有什么区别
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 返回递归调用和仅递归调用的区别
- EASTL矢量<向量<int>>连续的
- Qt:remove() 和 rmdir() 有什么区别
- 这 4 个 lambda 表达式之间有什么区别?
- 结构体 S { int align; } 之间的区别;(struct 关键字后的名称)和 struct { int al
- (double) 和 double() 之间的区别
- 将向量作为类>(值)<向量启动和向量<类>[值]有什么区别
- typedef 枚举和枚举类有什么区别?
- &C::c 和 &(C::c) 有什么区别?