将无符号长整整转换为有符号长整整可能吗?
Casting an unsigned long long int to signed long long int Is it possible?
来自
传感器的数据有两种格式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)));
是的,这是可能的。你甚至不需要演员表。只需将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)的值,这是一个负值。
因此,如果您确定感官数据的范围,那么您可以安全地在两者之间投射,否则不会。
相关文章:
- 为什么 std::(i)ostream 将有符号/无符号字符视为文本而不是整数
- 警告 C4018:">=":VSC++ 2010 中的有符号/无符号不匹配
- 有符号/无符号不匹配,并且函数在转换为函数时不带2个参数
- 符号"重新声明(有符号/无符号,精度)与
- 有符号/无符号特征编程
- 有符号/无符号 int 不匹配
- 断言(true)警告有符号/无符号不匹配
- 有符号/无符号比较警告是什么意思
- 数组索引的类型:有符号/无符号整数先锋
- 没有兼容的方法来转换相同大小的有符号/无符号
- 溢出的有符号/无符号赋值及其结果
- C++隐式转换(有符号 + 无符号)
- 增强size_type的有符号/无符号比较和multi_array的索引
- 警告 C4018:'>':有符号/无符号不匹配
- c++自动重写有符号/无符号
- C++警告 C4018:"<":有符号/无符号不匹配
- 错误:comp. bet.有符号/无符号整数表达式
- gcc和有符号/无符号比较的奇怪警告行为
- Visual Studio 2013有符号/无符号整数数学行为不同时,求值表达式作为函数参数,编译器切换
- 整数提升,有符号/无符号,和打印