gpt4 book ai didi

在C中使用超出其范围的变量进行计算

转载 作者:行者123 更新时间:2023-12-04 09:37:41 27 4
gpt4 key购买 nike

如果我使用一个变量进行计算,其中计算的中间部分高于该变量类型的边界,是否存在一些平台可能不喜欢的危险?

这是我要问的一个例子:

int a, b;
a=30000;
b=(a*32000)/32767;

我已经编译了这个,它确实给出了 29297 的正确答案(好吧,无论如何,在截断错误之内)。但是让我担心的部分是30,000*32,000 = 960,000,000,这是一个30位的数字,因此不能存储在16位的int中。最终结果完全在 int 的范围内,但我期望内存的任何工作部分都将分配与最大源变量相同的大小,因此会发生溢出错误。

这只是一个展示我的问题的小例子,我试图通过使分数成为能够存储在该变量中的最大数量的一小部分来避免使用 float (在这种情况下,一个带符号的整数,所以正面是 32767),因为我相信我正在使用的嵌入式系统没有 FPU。

那么大多数处理器如何处理超出源变量和目标变量范围的计算?

最佳答案

在 16 位编译器/CPU 上,您(几乎)可以计划该代码给出不正确的结果。这有点令人难过,因为几乎每个 CPU(都有乘法指令)都会产生并存储中间结果,但是没有 C 编译器(据我所知)通常会使用它(如果你制作了 ab 未签名,不允许使用它)。

您有几种选择来处理这个问题。一种是用汇编语言编写小的 muldiv 函数,执行乘法(保留高位字),然后除法,最后在将值缩小回范围内时将值返回给 C。

另一种选择是对无符号整数进行数学运算,这至少可以让您弄清楚问题何时发生。不幸的是,没有一个选择是我认为特别有吸引力的……

关于在C中使用超出其范围的变量进行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2519962/

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