【发布时间】:2018-09-03 19:34:07
【问题描述】:
我有一个设备的 C 固件,它将一组 6 个以二进制编码的标志发送到桌面应用程序。在给定的时刻,固件会创建一个unsigned int 变量,它会尝试添加六个数字,从 0 到 30,以 5 位编码。与使用的代码类似的代码如下:
KVAr_estagios_1_to_6 = 1;
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (2 * (0x00000020));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (3 * (0x00000400));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (4 * (0x00008000));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (5 * (0x00100000));
KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));
在进行测试时,我发现六个数字中的第一个总是出错:它始终为零,与设置的值无关(在我上面的代码示例中,1)。而且,这只是在代码中添加了第六行,最后一行之后才发生的;如果只添加 5 次,则不会出现问题。
所以在上面的代码示例中,我希望看到十进制数 206703681 显示,相当于二进制 001100010100100000110001000001。然而,它显示的是 206703680 或 1100010100100000110001000000 。如果我决定不插入最后一行代码 (KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));),问题就会消失,第一个数字已正确设置,但现在缺少我要发送的最后一个标志。
我尝试了许多不同的方法来进行二进制加法,但均未成功。我的印象是以某种方式添加额外的信息“溢出”变量,这是不应该发生的,因为我正在使用 unsigned int,也就是说,32 位是可用的。
感谢任何帮助。随意做澄清问题;描述正在发生的事情是一项艰巨的任务。
【问题讨论】:
-
这个很不清楚。发布的代码完全符合您的期望。请参阅ideone.com/wJsibr 而不是描述什么有效和什么无效的文本,您应该发布失败的代码及其输出
-
打印出该代码的结果给我 206703681。您说“与使用的代码类似的代码如下”。您应该显示您的实际代码。
标签: c binary integer-overflow