c++ - x64 和 arm64 之间的隐式类型转换和不同行为
问题描述
在 arm64 上测试我的软件时,我遇到了一个奇怪的问题。
我写了一些代码来重现这个问题:
char c;
int sum = 0;
for (int i = 0; i <= 255; i++)
{
c = i;
int a = c * 10;
sum += a;
std::cout << a << std::endl;
}
当我在 Windows(使用 Visual Studio 2017 构建)或 Ubuntu x64(gcc 9.3.0-17)上运行它时,我得到以下结果:
0
10
...
1260
1270
-1280
-1270
-20
-10
sum=-1280
如果我在 Ubuntu arm64 (gcc 9.3.0-17) 上运行相同的代码,我会得到不同的结果:
0
10
...
1260
1270
1280
1290
...
2540
2550
sum=326400
我不知道在 arm64 上的 gcc 中是否有一些额外的优化(使用 -O3),或者是否有一些我看不到的问题?关于如何解决这个问题的任何想法?
解决方案
char
数据类型可以是有符号或无符号。在前者的情况下(似乎是针对 x64 的情况),该语句将在循环的第 129次迭代中c = i
导致溢出(a 的最大值为127),并且它被分配的值已经“包装”舍入'到负值。for
signed char
但是,当以 arm64 为目标时,您的编译器似乎使用了无符号 char
类型(范围为0
thru 255
),因此该语句中没有溢出,并且算术“按预期”进行。
要确认(或以其他方式)上述诊断,只需检查不同构建环境中CHAR_MAX
常量(在<climits>
头文件中定义)的值。
推荐阅读
- python - 如何允许用户在 Python 中使用 while 循环输入列表列表
- html - 字体真棒图标随着窗口调整大小在输入字段中移动
- node.js - WebSocket 握手期间的 Socket.io 错误:意外的响应代码:500 windows server iis
- javascript - 为什么在 reactjs 中使用 JSON.parse 会导致跨源错误?
- sql - 在 SQL 查询中,我无法获得真正的数据
- python - 尽管已安装 Python 无法导入模块
- json - 如何访问从 Flutter 中的 HTTP POST 请求获得的 JSON 响应?
- java - 当您不知道循环中将输入多少个变量时,如何分配多个变量?
- android - 通过 Socket.io websocket 从我的应用程序向特定的 socketId 发送 json 和音频文件
- tensorflow - 验证 GPU 是否在 Keras/Tensorflow 中实际使用,而不仅仅是验证为存在