将无符号长整整转换为有符号长整整可能吗?

Casting an unsigned long long int to signed long long int Is it possible?

本文关键字:符号 无符号 转换      更新时间:2023-10-16
来自

传感器的数据有两种格式SaHpiUint64TSaHpiInt64T,应用程序设计为仅处理SaHpiUint64T数据。

如果可能的话,铸造可能会有什么副作用?

/* unsigned 64-bit data, 8-byte alignment  */
typedef unsigned long long int  SaHpiUint64T __attribute__((__aligned__(8)));
/* signed 64-bit data, 8-byte alignment    */
typedef signed long long int SaHpiInt64T __attribute__((__aligned__(8)));

是的,这是可能的。你甚至不需要演员表。只需将long long int分配给unsigned long long int变量即可。

但是,long long int当然可以包含负值。如果您的long long int传感器读数从不为负,则没有问题。如果它们可以为负数,则这些负值将在转换为unsigned long long int时变成大的正数。你如何处理这个问题,如果你处理它,这取决于你。

如果您知道传感器可以产生负值,则添加偏移量以使偏移值始终为非负值会更有意义。两种选择是可能的最小传感器读数和最小unsigned long long int。使用这种偏移方法,在最大可能的有符号值处不再存在不连续性。

当然你可以

投射它们,但你可能完全错误地解释你的数据:D

整数变量

的最后一位(最大值)是变量的符号,如果是有符号的整数。

现在,如果你感应到有符号值,并且你感知到一个负变量,并将其转换为无符号变量,在这种情况下,你最终会得到一个非常大的数字(2^63 + abs(原始变量))。

如果你以无符号形式感知,并且你感应到一个大于 2^63 的值,并将其转换为有符号 int,你最终会得到一个等于(原始值 - 2^63)的值,这是一个负值。

因此,如果您确定感官数据的范围,那么您可以安全地在两者之间投射,否则不会。