为什么C++中printf("%llu\n", 1ull << n);和的输出printf("%llu\n", 1ull << 64);不同?
代码:
#include <cstdio>
int main()
{
int n = 64;
printf("%llu\n", 1ull << n);
printf("%llu\n", 1ull << 64);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1
0
Run Code Online (Sandbox Code Playgroud) 如果计数大于类型的宽度,如右移未定义行为中所讨论的那样?如果位移数超过有效操作数大小,则移位值是不确定的.
因此,在下面,值bar是未定义的:
uint32_t foo = 123;
uint32_t bar = (foo >> 33);
Run Code Online (Sandbox Code Playgroud)
这种轮班操作是否定义明确std::bitset?如:
std::bitset<32> foo(123);
std::bitset<32> bar(foo >> 33);
Run Code Online (Sandbox Code Playgroud)
我可以在哪个官方文件中找到这样的信息?
该案例未在cppreference上明确说明(https://en.cppreference.com/w/cpp/utility/bitset/operator_ltltgtgt).
我有以下功能:
void func(unsigned long v)
{
char max_byte = 0xFF;
char buffer[8];
buffer[0] = static_cast<char>((v) & max_byte);
buffer[1] = static_cast<char>((v >> 8) & max_byte);
buffer[2] = static_cast<char>((v >> 16) & max_byte);
buffer[3] = static_cast<char>((v >> 24) & max_byte);
buffer[4] = static_cast<char>((v >> 32) & max_byte);
buffer[5] = static_cast<char>((v >> 40) & max_byte);
buffer[6] = static_cast<char>((v >> 48) & max_byte);
buffer[7] = static_cast<char>((v >> 56) & max_byte);
}
Run Code Online (Sandbox Code Playgroud)
它接受一个unsigned long参数并将其8个字节插入char缓冲区(不要试图找出原因.它是一个有意义的函数的简洁版本).
此代码在64位上编译良好,但在32位上我得到以下警告:
warning: right shift count >= width …Run Code Online (Sandbox Code Playgroud) 我正在尝试通过组合16位和8位值来填充64位无符号变量:
uint8_t byte0 = 0x00;
uint8_t byte1 = 0xAA;
uint8_t byte2 = 0x00;
uint8_t byte3 = 0xAA;
uint16_t hword0 = 0xAA00;
uint16_t hword1 = 0xAAAA;
uint64_t result = ( hword0 << 32 ) + ( byte3 << 24 ) +
( byte2 << 16 ) + ( byte1 << 8 ) + ( byte0 << 0 );
Run Code Online (Sandbox Code Playgroud)
这给了我一个警告。
Run Code Online (Sandbox Code Playgroud)left shift count >= width of type [-Wshift-count-overflow] uint64_t result = ( hword0 << 32 )
为什么3右移32等于3而不是0。
我在nodeJs和Java中得到了这些结果