c – 为什么我不能reintpret_cast uint到int?
作者:互联网
这就是我想要做的事情:
const int64_t randomIntNumber = reinterpret_cast< int64_t> (randomUintNumber);
randomUintNumber的类型为uint64_t.
错误是(MSVC 2010):
error C2440: ‘reinterpret_cast’ : cannot convert from ‘const uint64_t’
to ‘int64_t’ 1> Conversion is a valid standard conversion,
which can be performed implicitly or by use of static_cast, C-style
cast or function-style cast
为什么不编译?两种类型都有相同的位长,是不是reinterpret_cast用于什么?
解决方法:
因为那不是reinterpret_cast的用途.使用reinterpret_cast的所有允许转换都涉及指针或引用,但整数或枚举类型可以重新解释为自身.这都是在标准[expr.reinterpret.cast]中定义的.
我不确定你想在这里实现什么,但如果你想randomIntNumber与randomUintNumber具有相同的值,那么你可以
const int64_t randomIntNumber = randomUintNumber;
如果这会导致编译器警告,或者您只是想更明确,那么:
const int64_t randomIntNumber = static_cast<int64_t>(randomUintNumber);
如果randomUintNumber小于263,则转换的结果与输入具有相同的值.否则结果是实现定义的,但我希望所有已知的具有int64_t的实现将定义它以做明显的事情:结果等效于输入模264.
如果你想randomIntNumber与randomUintNumber具有相同的位模式,那么你可以这样做:
int64_t tmp;
std::memcpy(&tmp, &randomUintNumber, sizeof(tmp));
const int64_t randomIntNumber = tmp;
由于int64_t保证使用二进制补码表示,因此您希望实现将static_cast定义为与uint64_t的超出范围值具有相同的结果.但实际上并没有在标准的AFAIK中得到保证.
即使randomUintNumber是编译时常量,遗憾的是randomIntNumber不是编译时常量.但是,“随机”是一个编译时常量?
标签:reinterpret-cast,c,type-conversion 来源: https://codeday.me/bug/20191005/1856511.html