gpt4 book ai didi

iphone - 在 ARM 与 Intel 上将 float 强制转换为 unsigned char

转载 作者:行者123 更新时间:2023-12-03 18:44:00 25 4
gpt4 key购买 nike

当我在 Intel 机器上运行以下 C 代码时...

float f = -512;
unsigned char c;

while ( f < 513 )
{
c = f;
printf( "%f -> %d\n", f, c );
f += 64;
}

...输出如下:

-512.000000 -> 0
-448.000000 -> 64
-384.000000 -> 128
-320.000000 -> 192
-256.000000 -> 0
-192.000000 -> 64
-128.000000 -> 128
-64.000000 -> 192
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0

但是,当我在 ARM 设备(本例中是 iPad)上运行相同的代码时,结果却截然不同:

-512.000000 -> 0
-448.000000 -> 0
-384.000000 -> 0
-320.000000 -> 0
-256.000000 -> 0
-192.000000 -> 0
-128.000000 -> 0
-64.000000 -> 0
0.000000 -> 0
64.000000 -> 64
128.000000 -> 128
192.000000 -> 192
256.000000 -> 0
320.000000 -> 64
384.000000 -> 128
448.000000 -> 192
512.000000 -> 0

正如您可以想象的那样,这种差异可能会在跨平台项目中引入可怕的错误。我的问题是:

  1. 我是否错误地假设将 float 强制转换为无符号字符会在所有平台上产生相同的结果?

  2. 这可能是编译器问题吗?

  3. 有优雅的解决方法吗?

最佳答案

C 标准对于您想要做的事情没有非常严格的规则。这是来自 6.3.1 算术操作数节(特别是 6.3.1.4 实数 float 和整数节)的相关段落:

When a finite value of real floating type is converted to an integer type other than _Bool, the fractional part is discarded (i.e., the value is truncated toward zero). If the value of the integral part cannot be represented by the integer type, the behavior is undefined.

关于您所询问的确切案例,甚至还有一个更具体的脚注:

The remaindering operation performed when a value of integer type is converted to unsigned type need not be performed when a value of real floating type is converted to unsigned type. Thus, the range of portable real floating values is (−1, Utype_MAX+1).

您的情况的

UtypeMAX+1256。你的不匹配案例都是负数。截断后,它们仍然为负,并且超出范围 (-1, 256),因此它们牢牢地处于“未定义行为”区域。即使您展示的一些匹配案例(其中 float 大于或等于 256)也不能保证有效 - 您只是运气好而已。

因此,您的编号问题的答案:

  1. 是的,你错了。
  2. 这是一个编译器问题,因为不同的编译器会给出不同的结果,但由于规范允许这样做,所以我不会真正将其称为编译器的错误。
  3. 这取决于您想要做什么 - 如果您能更好地解释这一点,SO 社区上的某个人几乎肯定能够为您提供帮助。

关于iphone - 在 ARM 与 Intel 上将 float 强制转换为 unsigned char,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4752315/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com