我有一个设备的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));
进行测试时,我发现第一个6位数总是错的:与设置的值无关(在我上面的代码示例1
中,它始终为零)。而且,只有在第六行(最后一行)之后才添加到代码中。如果仅添加5个,则不会出现问题。
因此在上面的代码示例中,我希望看到显示的十进制数206703681,与二进制001100010100100000110001000001等效。但是,它改为显示20670368 0 或110001010010000011000100000 0 。而且,如果我决定不插入最后一个代码行(KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));
),问题就消失了,第一个数字已正确设置,但现在却缺少我要发送的最后一个标志。
我尝试了许多不同的方法来进行二进制加法,但均未成功。我的印象是以某种方式添加了额外的信息“溢出”变量,这是我使用unsigned int时不应该发生的事情,即32位可用。
感谢您的帮助。随时提出澄清问题;描述正在发生的事情是一项艰巨的任务。
答案 0 :(得分:0)
无法复制(请参见下面的代码)。
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
答案 1 :(得分:0)
首先,很抱歉,如果我不能恰当地描述我的问题。甚至不是我通常使用的那种编程。
我的一个同事设法发现了问题所在:在给定的时刻,信息被转换为float变量,这以某种方式使事情搞砸了。这可能与用于十进制表示的位有关,尽管我不确定该问题如何解决,因为转换是独立于第6个数字进行的。删除浮动转换后,问题不再出现,并且现在一切正常。