gpt4 book ai didi

c - 在 Arduino 中转换有符号/无符号 int 变量时出现问题

转载 作者:行者123 更新时间:2023-11-30 14:33:22 25 4
gpt4 key购买 nike

我正在制作一个电路,将从 4011 移位寄存器中提取数据。到目前为止,它运行良好,但当我的数字超过某个值时,奇怪的事情开始发生。

此代码将循环我所有的 4011。

  typedef unsigned long u_long;

for (u_long i = 0; i < 32; i++)
{
digitalWrite(CLOCK_in,0);
delayMicroseconds(0.2);

bool bit = digitalRead(DATA_in);

Serial.print(bit,BIN);

if (bit) out |= (1 << i);

digitalWrite(CLOCK_in,1);
}
Serial.println((u_long)out);
Serial.println((u_long)out,BIN);

从第一个“print()”我得到:

00000000000000010000000000000000

这就是我所期待的,因为这是我的输入(我的目标是将其转换为无符号长十进制 - 最高数字为 32 位)。然而,从下一个 print() 中,我得到了 4294934528。我认为这是不正确的。从最后一个 print() 函数中,天真的我期望得到与第一个函数相同的答案,我得到了 11111111111111111000000000000000

我错过的重点在哪里? bitshift部分有问题吗?

最佳答案

我在没有 MCVE 的情况下立即发现了一个问题

for (u_long i = 0; i < 32; i++)
{
...
if (bit) out |= (1 << i);
...
}

在Arduino中int是16位类型,整数文字为int type by default 。移位超过位宽 invokes undefined behavior ,因此当 i > 15 时,您的代码具有 UB

要解决此问题,请使用 L 后缀使其成为 long 文字

if (bit) out |= (1L << i);

但是没有理由在 Arduino 中使用慢速 32 位变量进行循环。只需使用int,甚至更好的uint8_t。还可以将 uint32_t 与标准 UINT32_C 宏一起用于输出类型,这样您就无需找出正确的后缀

uint32_t out;
for (int i = 0; i < 32; i++)
{
...
if (bit) out |= UINT32_C(1) << i;
...
}

也就是说,您仍然需要提供 MCVE

关于c - 在 Arduino 中转换有符号/无符号 int 变量时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59365431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com