我正在做一个业余项目,为 Arduino Duemilanove 制作一些服务器代码,但在我在控制器上测试此代码之前,我正在我自己的机器上测试它(基于 OS X 的 macbook)。我在某些地方使用整数,我担心在 Arduino Duemilanove 上编译和运行代码时会出现奇怪的错误,因为 Arduino 将整数处理为 2 个字节,而我的 macbook 将整数处理为 4 个字节。我不是一个铁杆 C 和 C++ 程序员,所以我有点担心一个有经验的程序员会如何处理这种情况。我是否应该使用 typedef 来限制代码,该 typedef 包含我自己的定义和 int 限制为 2 个字节?或者还有其他方法吗?
5 回答
你最好的选择是使用stdint.h
标题。它定义了明确引用变量的符号和大小的 typedef。例如,一个 16 位无符号整数是uint16_t
. 它是 C99 标准的一部分,因此几乎无处不在。看:
C 标准将 int 定义为足够大的有符号类型,至少可以容纳 -32768 和 32767 之间的所有整数 - 实现可以自由选择更大的类型,并且任何现代32 位系统都将选择 32 位整数。但是,正如您所见,一些嵌入式平台仍然使用 16 位整数。我建议使用uint16_t
或者uint32_t
如果您的 arduino 编译器支持它;如果没有,请使用预处理器宏自己对这些类型进行类型定义。
处理这种情况的正确方法是根据需要表示的值选择类型:
- 如果是一般的小整数,-32767到32767的范围是可以的,使用
int
; - 否则,如果范围 -2147483647 到 2147483647 是可以的,使用
long
; - 否则,使用
long long
. - 如果 -32767 到 32767 的范围可以并且空间效率很重要,请使用
short
(或者signed char
,如果 -127 到 127 的范围可以)。
只要您没有对这些做出其他假设(即始终使用sizeof
而不是假设类型的宽度),那么您的代码将是可移植的。
一般来说,您应该只需要使用固定宽度类型stdint.h
的值,这些值通过二进制接口与另一个系统交换 - 即。从网络或文件中读取或写入。
您需要小于 -32,768 还是大于 +32,767 的值?如果没有,请忽略不同的尺寸。如果您确实需要它们,则可以使用带有固定大小整数的 stdint.h,singned und unsigned,称为 intN_t/uintN_t(N = 位数)。它是 C99,但大多数编译器都会支持它。请注意,使用大小大于 CPU 字大小(在本例中为 16 位)的整数会损害性能,因为没有处理它们的本机指令。
避免使用类型int
,因为它的大小可能取决于架构/编译器。
使用short
andlong
代替