【发布时间】:2021-01-17 05:34:41
【问题描述】:
我需要创建一个数字,其中 (f)16 重复 n 次。 0
我尝试了以下例如 n = 16
std::cout << "hi:" << std::hex << std::showbase << (1ULL << 64) - 1 << std::endl;
警告:移位计数 >= 类型 [-Wshift-count-overflow] 的宽度 std::cout
嗨:0x200
如何在不溢出ULL 的情况下获取所有数字f?
【问题讨论】:
-
尝试使用
4的倍数作为您移动的幻数。 -
陈述人们一直在暗示的内容:如果
unsigned long long有64 位,那么(1ULL << 64) - 1具有明确定义和可移植的行为,并将赋予价值0xffffffffffffffffULL。 -
@aschepler:
1ULL << 64没有明确定义或可移植的行为。根据 C++ 草案 N4659 8.8 1,“如果右操作数为负数,或者大于或等于提升的左操作数的位长度,则行为未定义。” -
@Someprogrammerdude:使用变量可能会规避警告,但不会规避未定义的行为。根据我对上述 C++ 标准的引用,无论移位量是否为常量,标准都没有定义与类型中的位数一样多的移位。
-
@puio:这种情况下的行为也没有由 C++ 标准定义,因为
<< n*4移动了 64 位,但您的实现中unsigned long long的宽度是 64 位。
标签: c++ bit-manipulation 64-bit bitmask