签署双重签名到未签名的字节:ARM64与Win64
signed double to unsigned byte: ARM64 versus Win64
出于某些遗产原因,我的代码对双重签名的字节进行了双重命名,我们看到了两个平台之间的差异。没有做 - "不要尝试将签名的值塞入无符号值中;不要尝试在整数中填充双重值",还有其他可以做的事情吗?
unsigned char newR1 = -40.16;
newr1的值是Windows上的216(正如我们从长期以来所期望的那样);但是在ARM64上是0。
胜利:
00007FF75E388818 cvttsd2si eax,mmword ptr [R]
00007FF75E38881D mov byte ptr [newR1],al
在ARM64
上00007FF6F9E800DC ldr d16,[sp,#0x38 |#0x38 ]
00007FF6F9E800E0 fcvtzu w8,d16
00007FF6F9E800E4 uxtb w8,w8
00007FF6F9E800E8 strb w8,[sp,#0x43 |#0x43 ]
也会尝试这些,但只是想要其他一些意见
unsigned char newR1 = -40.16;
unsigned char newR2 = (int)-40.16;
unsigned char newR3 = (unsigned char)-40.16;
unsigned char newR4 = static_cast<int>(-40.16);
或可能是
int i = -40.16;
unsigned char c = i;
C标准所说的内容(C 中有类似的文本):
当真实浮动类型的有限值转换为整数 除_bool以外的其他类型,分数部分被丢弃(即 值将其截断为零)。如果整体部分的价值 不能用整数类型表示,行为是不确定的。
因此,从double
到unsigned char
的单个铸件中,在-40.16中获得216,已经是UB。实际上,在这种情况下获得任何结果是UB。这就是为什么编译器可以自由生产任何东西而不是您想要的216。
您可能想做两个演员:
(unsigned char)(int)-40.16
再次,第一个演员(to int)仍受到我引用的上述限制。
相关文章:
- 用于解析 win64 堆栈跟踪的命令行客户端(可以访问符号服务器)
- 从C/C++(Win64)中的内存加载64位DLL
- 为arm64-v8a编译Qt和OpenCV
- 如何将 arm64 中的vaddv_u8结果视为氖寄存器
- 如何从 c++ 代码生成 arm64-v8a 64 位共享对象?
- 在Win64失败上构建OpenSSL
- Tensorflow Lite ARM64错误:无法转换‘const int8x8_t
- Apple Mach-O链接器错误 - 架构ARM64的未定义符号
- C++ 基于 WIN64 构建的 ADO 在 win32 操作系统上不起作用
- 签署双重签名到未签名的字节:ARM64与Win64
- 架构 arm64 的未定义符号仅在构建框架时
- CMAKE错误:无法创建名为“发电机Visual Studio” 15 2017 Win64-T
- Android NDK:如何为ARM64-V8A构建最小值= 19
- 即使Visual Studio 14 2015 Win64工具链已启用,也将32位工具链用于编译
- 如果应用程序仅针对 armv7 和 armv7 编译,则在 arm64 设备上运行时,它使用什么大小的数据类型
- 哪一个是针对Win32和Win64开发的最低Visual Studio版本
- 跨Win32和Win64应用程序
- sprintf_s对win64和win32有特定的使用要求吗
- 双精度数组和结果与 WIN32 和 WIN64 上的C++不一致
- 变量参数函数:在 iOS arm64 上va_arg访问错误