我正在开发一个备用项目,为Arduino Duemilanove制作一些服务器代码,但在我在控制器上测试这个代码之前,我正在自己的机器上测试它(基于OS X的macbook)。我正在使用某些地方,我担心这会在代码编译并在Arduino Duemilanove上运行时出现奇怪的错误,因为Arduino处理整数为2个字节,而我的macbook处理整数为4个字节。我不是一个核心的C和C ++程序员,所以我有点担心一个有经验的程序员如何处理这种情况。 我应该使用typedef来限制代码,该typedef包含我自己的限制为2的字节和int的定义吗?或者还有另一种方法吗?
答案 0 :(得分:11)
最好的办法是使用stdint.h
标题。它定义了明确引用变量的符号和大小的typedef。例如,16位无符号整数是uint16_t
。它是C99标准的一部分,因此几乎无处不在。参见:
答案 1 :(得分:6)
C标准将int定义为一个足够大的签名类型,至少保存-32768和32767之间的所有整数 - 实现可以自由选择更大的类型,以及任何现代的 32位系统将选择一个32位整数。但是,正如您所见,一些嵌入式平台仍然使用16位整数。如果您的arduino编译器支持,我建议使用uint16_t
或uint32_t
;如果没有,请使用预处理器宏自行键入这些类型。
答案 2 :(得分:4)
处理这种情况的正确方法是根据需要表示的值选择类型:
int
; long
; long long
。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
,因为它的大小可能取决于体系结构/编译器。
使用short
和long
代替