C++ C++;:按位移位的零值
一个愚蠢的问题。我只是做了一些测试。我的期望是:C++ C++;:按位移位的零值,c++,bit-manipulation,C++,Bit Manipulation,一个愚蠢的问题。我只是做了一些测试。我的期望是: uint32_t v = ~ (uint32_t) 0; v <<= sizeof(uint32_t) * 8; uint32\u t v=~(uint32\u t)0; v你处于膝盖深的未定义行为中: 在任何情况下,如果右操作数的值为负数或 大于或等于提升后的左操作数中的位数, 该行为未定义 按类型宽度(或更多)移位是未定义的行为启用优化以在结果上重新掷骰子您的编译器应该给您警告:您应该从gcc 8.3中得到警告,这里没有什么争议
uint32_t v = ~ (uint32_t) 0;
v <<= sizeof(uint32_t) * 8;
uint32\u t v=~(uint32\u t)0;
v你处于膝盖深的未定义行为中:
在任何情况下,如果右操作数的值为负数或
大于或等于提升后的左操作数中的位数,
该行为未定义
按类型宽度(或更多)移位是未定义的行为启用优化以在结果上重新掷骰子您的编译器应该给您警告:您应该从gcc 8.3中得到警告,这里没有什么争议,大多数处理器在移位32/64位值时移位5/6位。ARM是一个例外-它使用8位(当参数在寄存器中时)。这可能就是Java和C明确指定相同行为的原因。
size_t v = ~ (size_t) 0;
v <<= sizeof(size_t) * 8;