【问题标题】:Binary edit leading to erase of previously binary added number二进制编辑导致擦除先前二进制添加的数字
【发布时间】: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


【解决方案1】:

无法重现(参见下面的代码)。

int main() {
    uint32_t result = 0;
    for(int i=0; i<6; i++) {
        uint32_t factor = 1 << (i*5); // left shift 1 by "i times 5 bits"
        result += (i+1)*factor;
        printf("factor for position %d: %08X\n",i+1,factor);
    }

    printf("result: %u\n",result);

    for(int i=0; i<6; i++) {
        uint32_t value = result & 0x1F;
        printf("value for position %d: %d\n",i+1,value);
        result >>= 5;
    }
}

输出:

factor for position 1: 00000001
factor for position 2: 00000020
factor for position 3: 00000400
factor for position 4: 00008000
factor for position 5: 00100000
factor for position 6: 02000000
result: 206703681
value for position 1: 1
value for position 2: 2
value for position 3: 3
value for position 4: 4
value for position 5: 5
value for position 6: 6

【讨论】:

    【解决方案2】:

    首先,如果我无法恰当地描述我的问题,我深表歉意。这甚至不是我通常使用的那种编程方式。

    我的一位同事设法发现了问题所在:在给定的时刻,信息被转换为浮点变量,这不知何故把事情搞砸了。这可能与用于十进制表示的位有关,尽管我不确定问题是如何工作的,因为转换是独立于第 6 个数字的附加完成的。移除浮动转换后,问题不再出现,现在一切正常。

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 2012-01-22
      • 1970-01-01
      • 2017-03-14
      • 2019-02-20
      • 2014-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多