Arduino代码:移位比特似乎将数据类型从int更改为long

时间:2016-03-16 19:03:24

标签: c++ types arduino

在我的Arduino上,以下代码生成的输出我不明白:

void setup(){
  Serial.begin(9600);
  int a = 250;

  Serial.println(a, BIN);
  a = a << 8;
  Serial.println(a, BIN);
  a = a >> 8;
  Serial.println(a, BIN);


}

void loop(){}

输出结果为:

11111010
11111111111111111111101000000000
11111111111111111111111111111010

我理解第一行:前导零没有打印到串行终端。但是,在移位后,a的数据类型似乎已从int更改为long(打印32位)。预期的行为是位被移位到左侧,而位被移位&#34; out&#34;只需删除int中的16位。将位移回不会转动&#34; 32位&#34;变量为&#34; 16bit&#34;试。

移位7个或更少的位置不会显示此效果。

我可能应该说我没有使用Arduino IDE,而是使用来自https://github.com/sudar/Arduino-Makefile的Makefile。

发生了什么事?我几乎都认为这是正常的#34;但是我没有得到它。或者它是印刷例程中的一些东西,只是简单地将16&#34; 1&#34;添加到输出中?

恩诺

2 个答案:

答案 0 :(得分:1)

Arduino中的功能打印编号在 /arduino-1.0.5/hardware/arduino/cores/arduino/Print.cpp

中定义
size_t Print::printNumber(unsigned long n, uint8_t base) {
  char buf[8 * sizeof(long) + 1]; // Assumes 8-bit chars plus zero byte.
  char *str = &buf[sizeof(buf) - 1];

  *str = '\0';

  // prevent crash if called with base == 1
  if (base < 2) base = 10;

  do {
    unsigned long m = n;
    n /= base;
    char c = m - base * n;
    *--str = c < 10 ? c + '0' : c + 'A' - 10;
  } while(n);

  return write(str);
}

所有其他功能都依赖于此功能,所以是的 int 会在您打印时提升为 unsigned long ,而不是在您移动时。

但是,图书馆是正确的。通过向左移动8个位置,整数中的负位变为“1”,因此当整数值被提升为无符号长时,运行时正确地用16个额外的'1'代替'0'来填充它。

如果您使用的数字不是数字而是包含某些标记,请使用 unsigned int 而不是 int

ETA:为了完整性,我将为第二次换档操作添加进一步的解释。

一旦触摸 int 数字内的“负位”,当您向右移动时,运行时将数字填入“1”以保留其负值。向左移动 k 位置对应于将数字除以 2 ^ k ,并且由于该数字为负数,因此结果必须保持为负。

答案 1 :(得分:1)

除了其他答案,整数可能会以16位或32位存储,具体取决于您拥有的arduino。