我想将 sint 64 位数据转换为 uint 32 位数据,但 C 运算符不得用于 64 位数据(强制转换、算术运算符和比较运算符)。这用于 autosar EFX 库函数。
2 回答
我从未使用过AUTOSAR Specification of Extended Fixed Point Routines,但从文档中推断,它只是:
sint64 var = 5;
uint32 low, high;
low = Efx_Cast_s64_u32(var);
var = Efx_Div_s64u32_s64(var, UINT32_MAX);
high = Efx_Cast_s64_u32(var);
Efx_Div_s64u32_s64(..., UINT32_MAX)
用作向右移位 32 位,以获取较高的 32 位。演员表是使用适当的功能完成的。
该标准确实说[SWS_Efx_00415] ⌈
C operators shall not be used for 64bit data (cast, arithmetic operators and
comparison operators) ⌋ ( )
,但它在下面给出了进行强制转换、算术运算和比较操作所需的所有函数。从可移植性的角度来看,这很棒,可以轻松集成到没有本机 64 位数据类型的平台。从程序员的角度来看 - 您必须使用专用函数来访问 64 位数据类型。
如果您无法以任何方式使用 C 运算符触摸该值(为什么?您确定您没有误解要求吗?),唯一剩下的就是复制原始字节。
如果您的平台是 little-endian,您可以对memcpy
从 64 位整数到 32 位整数的前 4 个字节进行粗略处理,或者如果您的平台是 big endian ,则对最后4 个字节进行粗略处理。如果它是混合字节序(非常罕见)或 64 位数据具有不同的字节序(例如,它是“网络顺序”,与您机器的本机字节序不同),您将不得不以不同的顺序复制,但它是没什么复杂的,你只需要弄清楚字节顺序。