【发布时间】:2021-03-14 06:06:13
【问题描述】:
通信对等方发送了一个 uint64_t 数据字段,它带有我需要存储到不支持无符号整数类型的 Postgresql-11 数据库中的订单 ID。
虽然真实数据可能超过 2^63,但我认为 Postgresql11 中的INT8 可以容纳它,如果我仔细进行一些转换。
假设有:
uint64_t order_id = 123; // received
int64_t to_db; // to be writed into db
我计划使用以下方法之一将 uint64_t 值转换为 int64_t 值:
-
to_db = order_id;// 直接赋值; -
to_db = (int64_t)order_id;//c-style cast; to_db = static_cast<int64_t>(order_id);to_db = *reinterpret_cast<const int64_t*>( &order_id );
当我需要从数据库加载它时,我可以进行反向转换。
我知道它们都有效,我只是对哪个最符合 C++ 标准感兴趣。
换句话说,哪种方法在任何 64 位平台和任何编译器中始终可以工作?
谢谢!!!
【问题讨论】:
-
如果值超过 2^63-1,每一个都是未定义的行为。
-
还有一个附加选项:
memcpy(&to_db, &order_id, 8);. -
@DanielLangr 有效.. 只要写入这些值的系统和读取它们的系统处于相同条件
-
@n.'pronouns'm。此外,AFAIK,第 4 种情况总是产生未定义的行为。
标签: c++ casting reinterpret-cast static-cast signedness