当前位置: 首页 > 知识库问答 >
问题:

C++中相互转换不同签名类型的最佳方式是什么?

尉迟正平
2023-03-14

通信对等方发送了一个uint64_t数据字段,它包含一个订单ID,我需要将其存储到不支持无符号整数类型的PostgreSQL-11 DB中。虽然一个实际数据可能超过2^63,但我认为如果我仔细执行一些强制转换,在PostgreSQL 11中的int8文件可以容纳它。

假设有:

uint64_t order_id = 123; // received
int64_t  to_db;          // to be writed into db

我计划使用以下方法之一将uint64_t值强制转换为int64_t值:

    null

谢谢!!!

共有1个答案

姚子石
2023-03-14

取决于它将在哪里编译和运行...任何一个没有C++20支持的不完全便携的。

如果不这样做,最安全的方法是通过改变值的范围来进行转换,类似于

int64_t to_db = (order_id > (uint64_t)LLONG_MAX) 
           ? int64_t(order_id - (uint64_t)LLONG_MAX - 1) 
           : int64_t(order_id ) - LLONG_MIN;

uint64_t from_db = (to_db < 0) 
                    ? to_db + LLONG_MIN
                    : uint64_t(to_db) +  (uint64_t)LLONG_MAX  + 1;

如果order_id大于(2^63-1),那么order_id-(uint64_t)llong_max-1将产生一个非负值。如果不是,那么转换为有符号是很好地定义的,减法确保值被移到负值范围。

 类似资料:
  • 我在一次面试中被问到以下问题: 问题:名称和签名相同但返回类型不同的方法。他问我,可能吗?这种类型叫什么。 有人能告诉我以下情况吗: > 上面的事情在任何情况下都是可能的(至少像一个在基类中,一个在派生类中?)如果是,是什么类型?比如编译或运行时多态? 在编译时多态性中,如果方法的返回类型与签名也不同,该怎么办?但只有函数的名称是相同的。还是编译时多态性吗? 在重写中,如果我有不同的返回类型,但方

  • 和是我用来表示成功和错误响应的两个类。

  • 本文向大家介绍在C ++中互相戴不同帽子的方式数量,包括了在C ++中互相戴不同帽子的方式数量的使用技巧和注意事项,需要的朋友参考一下 假设有n个人和40种不同类型的帽子,它们的标记范围是1到40。现在给出一个2D列表,称为帽子,其中hats [i]是第i个人所喜欢的所有帽子的列表。我们必须找到使n个人戴着不同帽子的方式的数量。答案可能非常大,因此请以10 ^ 9 + 7为模返回答案。 因此,如果

  • 为什么我的子类方法不重写其父类中相同签名的方法? 我有一个类,它扩展了一个抽象类,后者扩展了抽象类Actor(这里的上下文是一个pong游戏)。和都有一个具有相同签名的方法: 目的是让方法重写的方法。这里的问题是,当我在内部调用时,只调用的方法。 在中的上设置的断点会脱扣,而在中的上设置的断点从不脱扣。我还在方法上尝试了,但它仍然调用方法。 目标是让对象以与其他对象不同的速度上下移动。因此方法也会

  • 问题内容: 我已经使用Spring MVC 4(或Spring- Boot)编写了简单的rest应用程序。在控制器内,我已返回。但是在某些情况下,我想提供成功的JSON,如果有验证错误,我想提供错误的JSON。当前,成功和错误响应完全不同,因此我为错误和成功创建了2个类。如果内部逻辑正常,我想在控制器内返回。否则我想回来。有没有办法做到这一点。 和是2类,我使用以表示成功和错误响应。 问题答案:

  • 本文向大家介绍C#显式类型转换,包括了C#显式类型转换的使用技巧和注意事项,需要的朋友参考一下 示例