Я пытаюсь реализовать операцию, функцию с интерфейсом, подобным этому uint64_t foo(uint32_t,uint32_t)
, так что это простая реализация:
#include <iostream>
#include <cstdint>
uint64_t foo(const uint32_t &a, const uint32_t &b) {
return ((reinterpret_cast<const uint64_t &>(a)) +
(reinterpret_cast<const uint64_t &>(b)));
}
int main() {
uint32_t k1 = ~0;
uint32_t k2 = 1;
std::cout << foo(k1, k2) << "\n";
return (0);
}
Теперь мое внимание сосредоточено на reinterpret_cast
и +
оператор.
+
оператор должен быть в порядке, где он есть, потому что он вызывается 2 uint64_t
; так что проблема в том, reinterpret_cast
? Я не понимаю, почему …
Мое предположение о части памяти, которая близка a
или же b
так что результат reinterpret_cast
это 50% оригинала a
или же b
а остальные 50% — это случайный кусок памяти. Я, как этот актерский состав действительно работает?
Я уже пробовал несколько версий reinterpret_cast
даже с указателями, без удачи.
reinterpret_cast
по сути, говорит компилятору игнорировать всю его безопасность типов и просто принимать то, что вы делаете.
Вы говорите, что ваша ссылка — это не ссылка на 32-разрядное число, а на 64-разрядное число. Это, конечно, означает (в системе 8 бит на байт), 4 байта, которые могут содержать любые данные, считываются как часть вашего целого числа. У вас также есть проблема «переносимости», связанная с системами с прямым порядком байтов, в частности, когда более значимые байты появляются первыми и, следовательно, дают другое число, даже если другие байты действительно равны нулю.
Ваш правильный способ сделать это static_cast
и не использовать ссылки, но «передать по значению».
На самом деле, вы можете написать foo без какого-либо приведения.
uint64_t foo( uint64_t a, uint64_t b ) { return a + b; }
и вы можете звонить с 32-битными номерами и не беспокоиться, если они переполнены. (Попробуйте с умножением их).
Ты слишком стараешься. Передать по значению и использовать static_cast
, Также используйте uint_least32_t
или же uint_fast32_t
в зависимости от того, что больше подходит, чем настаивать на точном размере, который может не существовать.