如何在Arduino中使用“U”和“L”格式化符?


在浏览 Arduino 代码时,您可能会遇到一些后面跟着 **U** 或 **L** 或两者(或小写 **u** 和 **l**)的数字。这些是 **格式化符**,它们强制整数常量采用特定的格式。**U** 强制整数常量采用无符号数据格式,而 **L** 强制整数常量采用长整数数据格式。

这些格式化符可以在定义变量时使用,也可以在公式中直接使用一些整数值。

示例

int a = 33u;
# define b 33ul
int c = a*1000L;

以上所有代码都能正常编译。当然,有人可能会想知道,如果您要将数据类型限制为无符号 int(如第一个示例 **int a = 33u**),那么使用整数数据类型的意义何在。其实没有意义。它们只是传达意图(即您希望 Arduino 和读者将它们视为无符号 int 或长整数)。变量的类型仍然是 int。

示例

int a = 33u;
void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);
   Serial.println("Hello");
   a = a-45;
   Serial.println(a);
}
void loop() {
   // put your main code here, to run repeatedly:
}

串口监视器将打印 **-12**(表示 a 仍然是 int 类型;无符号 int 不能取负值)。

在上述示例之后,您可能想知道是否根本有必要指定 **U** 和 **L** 格式化符。好吧,下面的示例将为您提供一个用例。

示例

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);
   Serial.println("Hello");
   int x = -3;
   if(x < 5){
      Serial.println("Statement 1 is true");
   }
   if(x < 5U){
      Serial.println("Statement 2 is true");
   }
}
void loop() {
   // put your main code here, to run repeatedly:
}

串口监视器仅打印“**语句 1 为真**”。这是因为在第二种情况下(x < 5U),通过使用 U 格式化符,我们将算术运算转换为无符号算术运算。-3 的无符号等价物将大于 5。但是,如果您将上述代码重写为以下内容:

void setup() {
   // put your setup code here, to run once:
   Serial.begin(9600);
   Serial.println("Hello");
   int x = -3;
   int a = 5;
   int b = 5U;
   if(x < a){
      Serial.println("Statement 1 is true");
   }
   if(x < b){
      Serial.println("Statement 2 is true");
   }
}
void loop() {
   // put your main code here, to run repeatedly:
}

那么,这两个语句都将被打印。这表明 **类型** 优先于 **格式化符**。

更新于: 2021年7月24日

580 次查看

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告