将unsigned long long int转换为signed long long int是否可能?

时间:2014-01-09 09:01:18

标签: c++ c embedded

来自传感器的数据有2种格式 SaHpiUint64T SaHpiInt64T ,应用程序只能处理 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)));

2 个答案:

答案 0 :(得分:3)

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

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

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

答案 1 :(得分:0)

当然你可以施放它们,但你可能会完全错误地解释你的数据:D

整数变量的最后一位(最高值)是有符号int的情况下变量的符号。

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

如果您以无符号形式感知,并且感知到大于2 ^ 63的值,并将其转换为带符号的int,则最终将得到等于(原始值 - 2 ^ 63)的值,是负值。

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