在我的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;添加到输出中?
恩诺
答案 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。