математическая операция между 2 uint32_t, возвращающая uint64_t

Я пытаюсь реализовать операцию, функцию с интерфейсом, подобным этому 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даже с указателями, без удачи.

0

Решение

reinterpret_cast по сути, говорит компилятору игнорировать всю его безопасность типов и просто принимать то, что вы делаете.

Вы говорите, что ваша ссылка — это не ссылка на 32-разрядное число, а на 64-разрядное число. Это, конечно, означает (в системе 8 бит на байт), 4 байта, которые могут содержать любые данные, считываются как часть вашего целого числа. У вас также есть проблема «переносимости», связанная с системами с прямым порядком байтов, в частности, когда более значимые байты появляются первыми и, следовательно, дают другое число, даже если другие байты действительно равны нулю.

Ваш правильный способ сделать это static_cast и не использовать ссылки, но «передать по значению».

На самом деле, вы можете написать foo без какого-либо приведения.

uint64_t foo( uint64_t a, uint64_t b ) { return a + b; }

и вы можете звонить с 32-битными номерами и не беспокоиться, если они переполнены. (Попробуйте с умножением их).

4

Другие решения

Ты слишком стараешься. Передать по значению и использовать static_cast, Также используйте uint_least32_t или же uint_fast32_tв зависимости от того, что больше подходит, чем настаивать на точном размере, который может не существовать.

1

По вопросам рекламы [email protected]