我有一个设备的 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/