gpt4 book ai didi

c - int32_t 到 int64_t(或 float )

转载 作者:太空宇宙 更新时间:2023-11-04 00:38:02 30 4
gpt4 key购买 nike

我有一个用 C 语言编写的非常简单的算法,它从 int16_t 数组中获取值,将这些值乘以它们的位置,然后存储到 int32_t 数组中。还有一个 int64_t 类型的变量 sum 存储结果 _slops 数组中所有值的总和。这是代码。

#define LOGD(...) __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)

// these variables initialized separately

int16_t *from;
int32_t *_slops;
int32_t _overlapSize;
...

// main algorithm

int32_t pos;
int64_t sum = 0;
for(pos = 0; pos < _overlapSize; pos++) {
_slops[pos] = (from[pos] * pos * (_overlapSize - pos));
sum += (int64_t) _slops[pos];
if (pos == 2) {
LOGD("1 ---: %d", (from[pos] * pos * (_overlapSize - pos)));
LOGD("2 ---: %d", _slops[pos]);
LOGD("3 sum: %d", sum);
}
}
LOGD("sum: %d", sum);

当我运行代码时,我看到生成的 _slops 数组中有正确的值,但 sum 变量始终具有相同的值。

02-26 15:58:10.762: D/player(17466): 1 ---: 1154560
02-26 15:58:10.762: D/player(17466): 2 ---: 1154560
02-26 15:58:10.762: D/player(17466): 3 sum: 1504780888
02-26 15:58:10.762: D/player(17466): sum: 1504780904

02-26 15:58:10.840: D/player(17466): 1 ---: 890560
02-26 15:58:10.840: D/player(17466): 2 ---: 890560
02-26 15:58:10.848: D/player(17466): 3 sum: 1504780888
02-26 15:58:10.848: D/player(17466): sum: 1504780904

02-26 15:58:10.848: D/player(17466): 1 ---: 1791680
02-26 15:58:10.848: D/player(17466): 2 ---: 1791680
02-26 15:58:10.848: D/player(17466): 3 sum: 1504780888
02-26 15:58:10.848: D/player(17466): sum: 1504780904

我尝试将 sum 的类型更改为 float,但结果保持不变。我很确定我在类型转换方面做错了(int32_tint64_tint32_tfloat),但是我找不到正确的方法。

在 C 中执行此操作的正确方法是什么?一般来说,如果我将两个 int16_t 值相乘,然后乘以什么得到更大的结果(比如 int32_t),我该怎么做?非常感谢任何帮助。

最佳答案

除非int64_tint 的别名在你的机器上,你使用了错误的 printf格式指令。试试这个:

LOGD("sum: %" PRId64, sum);

PRId64是在 <inttypes.h> 中定义的宏.

如果您使用的是 GCC,请使用 -Wformat 进行编译会产生有关格式不匹配的错误。 -Wall将包括 -Wformat ,以及许多其他有用的警告。

对于您的第二个问题(关于如何加宽使用窄类型参数的二进制算术运算的结果),这是通过使至少一个操作数达到您想要的宽度来完成的。这可以通过强制转换来完成:

int16_t a = A_VAL;
int16_t b = B_VAL;
int32_t c = a + (int32_t)b;

maverik 所示的 answer ,您可能会在分配给 _slops[pos] 的表达式中发生有符号整数溢出.如果_overlapSize大于29,则pos * (_overlapSize - pos)的最大乘积大于 216,这意味着它与 from[pos] 的乘积可能会得到大于 231 的结果。

关于c - int32_t 到 int64_t(或 float ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22044772/

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