编辑:修改void *为uint8_t *值。问题仍然存在。编辑:问题是一个简单的变量溢出,与整数促销无关。
我解决了一个错误……
指针算术的行为 void* 未定义。
void*
指针算法仅在数组中有效。请注意,你可以 组 指向一个超过数组最后一个元素的指针,但不要尝试取消引用它。此规则也适用于可以将规则视为单个元素数组的对象。
(1)在你的代码中肯定没有遵守(你的编译器没有警告你 - 如果不是,请把它装箱),(2)可能不是。那时(我本人)有点讽刺,你的具体问题是不相关的。
乘法可能会溢出到8字节类型,我认为编译器可以防止丢失精度,对吧?
这是一个非常不正确的假设。每 3.4.3 C标准中未定义行为的描述 (加粗矿井):
的 3.4.3 强> 1使用不可移植或错误时的未定义行为行为 程序构造或错误数据,本国际 标准没有要求 2注意可能的未定义行为包括忽略该情况 完全具有不可预测的结果,在翻译过程中表现出色 或者以文件化的方式执行程序 环境(有或没有发出诊断信息),到 终止翻译或执行(发布a 诊断信息)。 3 的 示例未定义行为的示例是整数上的行为 溢出。 强>
的 3.4.3 强>
1使用不可移植或错误时的未定义行为行为 程序构造或错误数据,本国际 标准没有要求
2注意可能的未定义行为包括忽略该情况 完全具有不可预测的结果,在翻译过程中表现出色 或者以文件化的方式执行程序 环境(有或没有发出诊断信息),到 终止翻译或执行(发布a 诊断信息)。
3 的 示例未定义行为的示例是整数上的行为 溢出。 强>
整数溢出是C标准本身使用的未定义行为的一个例子。
和 288 * 24536838 等于 7066609344 ,这远远超出了32位的容量 int 不管它 signed 要么 unsigned ,从而调用未定义的行为。
288 * 24536838
7066609344
int
signed
unsigned
所以不,编译器不会“防止丢失精度”。事实恰恰相反。