3

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

4

5 回答 5

11

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

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

于 2010-07-20T22:16:27.220 回答
6

C 标准将 int 定义为足够大的有符号类型,至少可以容纳 -32768 和 32767 之间的所有整数 - 实现可以自由选择更大的类型,并且任何现代32 位系统都将选择 32 位整数。但是,正如您所见,一些嵌入式平台仍然使用 16 位整数。我建议使用uint16_t或者uint32_t如果您的 arduino 编译器支持它;如果没有,请使用预处理器宏自己对这些类型进行类型定义。

于 2010-07-20T22:15:57.317 回答
4

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

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

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

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

于 2010-07-20T22:44:52.983 回答
2

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

于 2010-07-20T22:19:03.410 回答
0

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

使用shortandlong代替

于 2010-07-20T22:14:04.153 回答