【发布时间】:2016-12-31 05:07:02
【问题描述】:
我已经阅读了关于可疑截断的这个 Lint 警告的相关问题,但这里是一个纯粹的 C 案例。
下面一行是Warning #647 弹出的地方:
pCont->sig -= (signed int64_t)((sub2 << 8)/pCont->freq + 1);
其中pCont->sig 也是 64 位有符号的(signed int64_t 类型),sub2 和 freq 都是 32 位无符号的。这一切都是用armcc编译的。
已经尝试将1 转换为无符号32 位,但没有成功,但问题仍然存在。
知道我可以尝试什么,或者这里出了什么问题吗?
【问题讨论】:
-
与您的问题无关,但
int64_t已经定义为signed,使用时无需再次指定signed。参见例如this fixed-width integer reference. -
您需要:
((int64_t)sub2 << 8) / pCont->freq + 1? -
您必须自己回答的基本问题:“为什么要使用有符号类型来存储值,而它永远不会是负数?”并且“当表达式永远不能产生超过 32 个有效位时,为什么要将其存储为 63 位值?”想想“当 sub2 太大并且值溢出时会发生什么?”也不会有什么坏处?只有在你可以说“我本来打算那样做的!”之后你能抑制警告吗?
标签: c lint truncation armcc