gpt4 book ai didi

c++ - Arduino 上的十六进制乘法

转载 作者:行者123 更新时间:2023-11-30 04:05:55 24 4
gpt4 key购买 nike

我使用高级动态类型语言编写代码已有很长时间,但我最近才开始使用 C++(在 Arduinos 上)。我正在尝试编写一个函数,将 00xFF(RGB 颜色值)之间的 3 个 int 转换为单个 unsigned long 将达到 0xFFFFFF。无符号长整型可以达到 0xFFFFFFFF,因此应该可以。

我在我的个人电脑上编写了以下测试,并用 g++ 编译了它:

#include <iostream>
using namespace std;

int main(){
unsigned long red = 0xff * 0x10000;
unsigned long green = 0xff * 0x100;
unsigned long blue = 0xff;
unsigned long color = red + green + blue;

cout << hex << red << "\n";
cout << hex << green << "\n";
cout << hex << blue << "\n";
cout << hex << color << "\n";
}

输出如预期的那样:

ff0000
ff00
ff
ffffff

这是有道理的。但是,我尝试在我的 Arduino 上运行以下命令:

void setup(){
unsigned long red = 0xff * 0x10000;
unsigned long green = 0xff * 0x100;
unsigned long blue = 0xff;
unsigned long color = red + green + blue;

Serial.begin(9600);
Serial.println(String(red, HEX));
Serial.println(String(green, HEX));
Serial.println(String(blue, HEX));
Serial.println(String(color, HEX));
}

void loop(){}

除非我遗漏了什么(这完全有可能),否则这段代码在功能上是相同的,只是它使用不同的方法来编写其输出。然而,这是它打印出来的:

ff0000
ffffff00
ff
feffff

怀疑架构可能与此有关,我尝试在 Mega 2560 和 Rainbowduino 3.0(基本上是带有 ATmega 328 的 Duemilanove)上运行该代码,两者的结果相同。如果我使用不同的数据类型,例如 uint32_t,我也会得到相同的结果。

我真的不知道发生了什么。谁能解释一下?

最佳答案

在 C++ 中,常量表达式是在编译时计算的。看起来 arduino 的编译器执行了错误的计算,不过——它将 0xFF 视为负数,并对其进行了符号扩展;这就是将最高字节设置为 0xFF 的原因。

您可以使用 type-specific suffixes 强制常量为正确的类型,像这样:

unsigned long red = 0xffUL * 0x10000UL;
unsigned long green = 0xffUL * 0x100UL;
unsigned long blue = 0xffUL;
unsigned long color = red + green + blue;

UL 后缀代表unsigned long

您可以使用移位和按位或,而不是将数字乘以 2 的幂并将结果相加,如下所示:

unsigned long red = 0xffUL;
unsigned long green = 0xffUL;
unsigned long blue = 0xffUL;
unsigned long color = (red << 16)
| (green << 8)
| (blue << 0);

上面的零移位是完全没有必要的——编译器会优化它。我添加它是为了使外观更一致。

关于c++ - Arduino 上的十六进制乘法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23083131/

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