其他分享
首页 > 其他分享> > c – 为什么我不能reintpret_cast uint到int?

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