二进制编辑导致删除先前二进制添加的数字
Binary edit leading to erase of previously binary added number
我有一个设备的 C 固件,它将一组以二进制编码的 6 个标志发送到桌面应用程序。在给定的时刻,固件会创建一个 unsigned int
变量,它会尝试向其中添加以 5 位编码的 0 到 30 之间的六个数字。与所用代码类似的代码如下:
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。然而,它显示的是 206703680 或1100010100100000110001000000。如果我决定不插入最后一行代码 (KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));
),问题就会消失并且第一个数字已正确设置,但现在缺少我要发送的最后一个标志。
我尝试了很多不同的方法来进行二进制加法,但都没有成功。我的印象是以某种方式添加额外信息 "overflows" 变量,这是不应该发生的事情,因为我正在使用 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
首先,如果我无法恰当地描述我的问题,我深表歉意。这甚至不是我通常使用的那种编程。
我的一个同事设法发现了问题所在:在给定的时刻,信息被转换为浮点变量,这不知何故把事情搞砸了。这可能与用于十进制表示的位有关,尽管我不确定问题是如何发生的,因为转换是独立于第 6 个数字的添加而完成的。删除浮动转换后,问题不再出现,现在一切正常。
我有一个设备的 C 固件,它将一组以二进制编码的 6 个标志发送到桌面应用程序。在给定的时刻,固件会创建一个 unsigned int
变量,它会尝试向其中添加以 5 位编码的 0 到 30 之间的六个数字。与所用代码类似的代码如下:
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。然而,它显示的是 206703680 或1100010100100000110001000000。如果我决定不插入最后一行代码 (KVAr_estagios_1_to_6 = KVAr_estagios_1_to_6 + (6 * (0x02000000));
),问题就会消失并且第一个数字已正确设置,但现在缺少我要发送的最后一个标志。
我尝试了很多不同的方法来进行二进制加法,但都没有成功。我的印象是以某种方式添加额外信息 "overflows" 变量,这是不应该发生的事情,因为我正在使用 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
首先,如果我无法恰当地描述我的问题,我深表歉意。这甚至不是我通常使用的那种编程。
我的一个同事设法发现了问题所在:在给定的时刻,信息被转换为浮点变量,这不知何故把事情搞砸了。这可能与用于十进制表示的位有关,尽管我不确定问题是如何发生的,因为转换是独立于第 6 个数字的添加而完成的。删除浮动转换后,问题不再出现,现在一切正常。