为什么int只有2个字节?


9

在其他平台上使用C / C ++时,int类型通常为4个字节(或可能更多)。但是,在Arduino上,只有2个字节。

为什么不同?如果我始终使用4字节,是否会影响性能long


2
请注意,这int是Arduino Due上的4个字节。short所有现有Ardunios上的A 将为2字节,但我强调其他人建议使用int16_tuint16_t
罗恩

Answers:


10

许多Arduino中使用的ATmega328是8位微控制器。这意味着寄存器是8位,数据总线是8位,端口是8位。系统有一些最小的16位方面(例如,计时器之一),但几乎所有内容都是8位。

因此,大多数操作一次处理8位。在除8位(即16位或32位整数和浮点数)以外的任何东西上工作都需要本质上可以描述为软件仿真的东西,其中编译器使用多个指令来处理这些较大的变量。

8位显然足以寻址8位端口。它也足以处理许多循环计数器,返回值和ASCII字符。但是,在处理数字时,这还远远不够。带符号的8位整数(int8_t)仅表示-128-> +127。无符号(uint8_t)只能表示0-> 255。

8位整数是非常有限的。C / C ++ int必须至少表示-32,678-> +32,767,因此映射到int16_t-这样做的最小大小。这样可以很好地平衡范围和效率。当初学者正在学习时,这一点尤其重要-溢出并不是非程序员真正理解的东西。

但是,这样做会对性能产生影响,因为大多数16位操作所花费的时间至少是8位操作的两倍,并且使用的寄存器数量是其两倍。这可能对您没有影响。

我们中的许多人都切换到本机类型,例如int8_t和uint8_t,因为它可以为您提供更多控制权。


3
请注意:不是将int映射到int16_t的Arduino团队,“ int”是C / C ++保留关键字,类型映射是ABI(gcc.gnu.org/wiki/avr-gcc)的一部分avr-gcc编译器的开发人员决定效仿。另一个值得注意的区别是通常是64位宽的“双精度”类型,而在avr-gcc中则是“浮点型”的32位
cmaglie 2014年

谢谢。不知道为什么我写了那个。我知道int必须代表32,678-> +32,767(尽管,实际上,我认为有一个专有的针对其中一个NEC处理器的编译器没有遵循)。我认为这是因为我不喜欢在嵌入式系统上隐藏宽度-使用int16_t更清晰。
Cyber​​gibbons

1
+1使用清晰的本机类型!在Arduino Due上,an int是32位的!arduino.cc/en/Reference/int
Ron

3

关于C和C ++语言的一个重要事实是,它们各自的标准未定义整数和浮点数类型的大小(以字节为单位)。

他们只是定义最小范围和这些范围之间的关系,例如

range(short) <= range(int) < range(long)

因此,例如的大小int通常取决于:

  • 目标平台(处理器)
  • 编译器本身

你在说sizeof(short) == sizeof(int) == sizeof(long)可能吗?
罗恩

@ ron-e从理论上讲,是可以的。但是,在实践中,我从未见过。在大多数编译器/平台中,人们可以期望(尽管没有强加)sizeof(short) < sizeof(long)
jfpoilpret 2014年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.