c - 二进制编辑导致删除先前添加的二进制数

标签 c binary integer-overflow

我有一个设备的 C 固件,它将一组以二进制编码的 6 个标志发送到桌面应用程序。在给定时刻,固件会创建一个 unsigned int 变量,并尝试向其中添加以 5 位编码的 0 到 30 之间的 6 个数字。与所使用的代码类似的代码如下:

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 或 110001010010000011000100000 0 。如果我决定不插入最后一个代码行 (KVAr_estagios_1_to_6 = KVAr_esttagios_1_to_6 + (6 * (0x02000000));),问题就会消失并且第一个数字已正确设置,但现在缺少最后一个数字我要发送的标记。

我尝试了许多不同的方法来进行二进制加法,但没有成功。我的印象是以某种方式添加额外的信息“溢出”变量,这是不应该发生的,因为我正在使用 unsigned int,即 32 位可用。

感谢任何帮助。请随意提出澄清问题;描述正在发生的事情是一项艰巨的任务。

最佳答案

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

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

关于c - 二进制编辑导致删除先前添加的二进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52155387/

相关文章:

c - 如何使用 libav/ffmpeg 编码 24 位音频?

c - 读取 HTTPS 流量中的 SSL 和 TLS 数据

c++ - 显示枚举值名称的通用方法

python - python 中的数据编码

c - 我的 shell 突然退出循环

compilation - 编译二进制文件

java - 文本字符串 二进制字符串 字节数组 float 和返回 Java

c - 使用最大有符号 int 值时,项目 euler 的函数出错

R:简单乘法导致整数溢出

c - C 中枚举类型的溢出?