我的电脑和Arduino上有不同的int尺寸

时间:2010-07-20 22:11:57

标签: c portability arduino

我正在开发一个备用项目,为Arduino Duemilanove制作一些服务器代码,但在我在控制器上测试这个代码之前,我正在自己的机器上测试它(基于OS X的macbook)。我正在使用某些地方,我担心这会在代码编译并在Arduino Duemilanove上运行时出现奇怪的错误,因为Arduino处理整数为2个字节,而我的macbook处理整数为4个字节。我不是一个核心的C和C ++程序员,所以我有点担心一个有经验的程序员如何处理这种情况。 我应该使用typedef来限制代码,该typedef包含我自己的限制为2的字节和int的定义吗?或者还有另一种方法吗?

5 个答案:

答案 0 :(得分:11)

最好的办法是使用stdint.h标题。它定义了明确引用变量的符号和大小的typedef。例如,16位无符号整数是uint16_t。它是C99标准的一部分,因此几乎无处不在。参见:

http://en.wikipedia.org/wiki/Stdint.h

答案 1 :(得分:6)

C标准将int定义为一个足够大的签名类型,至少保存-32768和32767之间的所有整数 - 实现可以自由选择更大的类型,以及任何现代的 32位系统将选择一个32位整数。但是,正如您所见,一些嵌入式平台仍然使用16位整数。如果您的arduino编译器支持,我建议使用uint16_tuint32_t;如果没有,请使用预处理器宏自行键入这些类型。

答案 2 :(得分:4)

处理这种情况的正确方法是根据需要表示的值选择类型:

  • 如果它是一般的小整数,范围-32767到32767就可以了,请使用int;
  • 否则,如果范围-2147483647到2147483647没问题,请使用long;
  • 否则,请使用long long
  • 如果-32767到32767的范围是OK 并且空间效率很重要,请使用short(或signed char,如果范围-127到127就可以了)。

只要您没有做出其他假设(即始终使用sizeof而不是假设类型的宽度),那么您的代码将是可移植的。

通常,您只需要使用stdint.h中的固定宽度类型来表示通过二进制接口与另一个系统交换的值 - 即。正在从网络或文件中读取或写入。

答案 3 :(得分:2)

您是否需要小于-32,768或大于+32,767的值?如果没有,请忽略不同的尺寸。如果确实需要它们,那么stdint.h具有固定大小的整数,单位和无符号,称为intN_t / uintN_t(N =位数)。它是C99,但大多数编译器都会支持它。请注意,使用大小大于CPU的字大小(在本例中为16位)的整数会损害性能,因为没有处理它们的本机指令。

答案 4 :(得分:0)

避免使用类型int,因为它的大小可能取决于体系结构/编译器。

使用shortlong代替