将无符号长长整型转换为有符号长长整型,这是否可能?

3

传感器数据有2种格式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)));

不是偿还抵押贷款,而是购买第二套房子? - undefined
请澄清一下 - 你是从有符号转换为无符号,还是从无符号转换为有符号? - undefined
你的处理器字长是多少,你从传感器那里期望得到什么数据?传感器能返回负值吗? - undefined
@Chowlett 我希望能够从有符号转换为无符号。 - undefined
我很想知道有哪种传感器具有63位的精确度... - undefined
显示剩余6条评论
2个回答

3
是的,这是可能的。您甚至不需要进行类型转换。只需将您的long long int分配给一个unsigned long long int变量即可。
然而,long long int当然可以包含负值。如果您的long long int传感器读数永远不会为负数,则没有问题。如果它们可以为负数,则在转换为unsigned long long int时,这些负值将变成大正数。如何处理这个问题,以及是否处理这个问题,由您决定。
如果您知道传感器可能产生负值,那么添加偏移量使得偏移值始终为非负数就更有意义。两种选择是最小可能的传感器读数和最小的unsigned long long int。使用这种偏移量方法,最大可能的有符号值处不再存在不连续性。

1
你不必须进行类型转换,但是这样会导致编译器发出警告(而且应该如此)。显式地进行类型转换(static_cast<unsigned long long>( ... ))不仅会消除警告,还会告知接替你工作的维护程序员:你已经考虑到了可能的影响。(你确实考虑过了,对吧?) - undefined
@DevSolar -- 重新但你最终会得到一个编译器警告。至少在使用gcc或clang时,启用了一组相当标准的警告选项(例如-Wall -Wextra),不会出现这种情况。你需要明确指定gcc/clang的编译器选项-Wconversion,才能在将有符号整数隐式转换为相同大小的无符号整数时获得警告。(即使如此,在C++中也不适用。你需要指定-Wsign-conversion作为编译器选项来获得此警告。) - undefined
1
@DevSolar - 无论如何,这里使用类型转换是一个非常好的主意,因为它能够表达意图。 - undefined
你能帮我理解为什么我得到的长正值在强制转换之前和之后都没有改变吗? - undefined
@yanivx - 在非负值的情况下,将有符号整数转换为无符号整数没有问题。它们可以完全转换。如果您在有符号整数本身中看到这些大正值,那是您的传感器的问题。问题出在输出为有符号整数的传感器上,它们可能产生负读数。这些负值在转换为无符号整数时会变成非常大的正数。 - undefined
显示剩余2条评论

0

当然你可以进行类型转换,但可能会完全错误地解释你的数据 :D

在有符号整数的情况下,你的整数变量的最后一位(最高位)代表了变量的符号。

现在,如果你使用有符号数进行读取,并且获取到一个负数变量,然后将其转换为无符号变量,那么在这种情况下,你将得到一个非常大的数值(2^63 + abs(原始变量))。

而如果你使用无符号形式进行读取,并且获取到一个大于2^63的数值,并将其转换为有符号整数,那么你将得到一个等于(原始数值 - 2^63)的负数。

因此,如果你对传感器数据的范围非常确定,那么你可以安全地在这两种类型之间进行转换,否则不能。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接