首页 > 解决方案 > 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),或者是否有一些我看不到的问题?关于如何解决这个问题的任何想法?

标签: c++gccarm

解决方案


char数据类型可以是有符号符号。在前者的情况下(似乎是针对 x64 的情况),该语句将在循环的第 129迭代中c = i导致溢出(a 的最大值为127),并且它被分配的值已经“包装”舍入'到负值。forsigned char

但是,当以 arm64 为目标时,您的编译器似乎使用了无符号 char类型(范围为0thru 255),因此该语句中没有溢出,并且算术“按预期”进行。


要确认(或以其他方式)上述诊断,只需检查不同构建环境中CHAR_MAX常量(在<climits>头文件中定义)的值。


推荐阅读