casting - 在 ARM 与 x86_64 上将 int 的 EOF 分配给 char 行为
问题描述
我在 ARM (iMX6) 和 intel 64 位上运行这段代码:
#include <stdio.h>
int main()
{
int i = EOF;
char d = i;
printf("i = %d, d = %d\n", i, d);
if (i == EOF)
printf ("i is EOF\n");
if (d == EOF)
printf ("d is EOF\n");
return 0;
}
在这两种情况下,我都使用 gcc 5.4 编译它: ARM: gcc (Ubuntu/Linaro 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609 x86_64: gcc (Ubuntu 5.4.0-6ubuntu1~16.04.10) 5.4.0 20160609
然而,结果却大不相同:
手臂:
i = -1, d = 255
i is EOF
x86_64:
i = -1, d = -1
i is EOF
d is EOF
为什么会这样?
解决方案
它是char
有符号的(即范围从-128 到127)还是无符号的(范围从0 到255)是实现定义的。
在您的ARM和gcc组合中,它显然是无符号的。因此 -1 转换为 255。
在x86_64和gcc的组合中,它已签名。因此,-1 被保留。
推荐阅读
- javascript - 用 Javascript 制作一个简单的 HTML 计算器问题
- python - 使用python在PPT上“发送回”一个形状
- javascript - 如何使用 javascript 下拉菜单将已创建的 html 表单附加到表中?
- c++ - 简单的定点转换如何工作?
- c++11 - 现代英特尔上的 g++ 9.2.1:获取从 C++11 atomic<> 或 C11 atomic_compare_exchange_strong 生成的 CMPXCHG16B 指令的任何方式
- javascript - 如何导入本地js包而不是网络包
- wix - 在 Bundle 中设置 InstallPrivileges = "elevated"。引导程序蜡
- html - 如何以角度为输入列表属性分配动态值
- java - 如何在 JAVA 中的 SSL 握手期间将签名算法从一个提供者添加到另一个提供者
- ms-access - 表未使用 runsql 保存在 Access 中