我应该相信C中的短路通常是2个字节吗?

cos*_*ost 2 c int short

我有一个大数字循环从0到65535(我选择16位只是为了有一个很好的截止点).我正在递增一个int,并且有一个if语句检查int是否为65536.如果是,则将int设置为0; 有点kludgy,但它的工作原理.我知道使用一个短的int并让它溢出会更有效率,但我最初没有这样做,因为短路不能保证是2个字节,这很可能.

这是在linux(ubuntu)机器上运行的C代码.如果我使用短片后来决定在另一个操作系统上运行该程序(或者说,在64位机器上运行它,因为我现在正在测试32位),是否有相当大的机会我的短片仍然是2个字节?我可以在几台不同的机器上轻松测试它,但是这里的一些人已经使用了很多电脑.我应该注意一个可怕的陷阱吗?

rub*_*nvb 7

谁也不能保证任何内置类型的大小等的int,char等等.(例如,参见这个问题,这个问题是关于C++的,但据我所知,在这方面也是准确的)

如果您需要固定大小的整数类型,请包含C99 <stdint.h>并使用固定宽度类型定义.


Jer*_*fin 5

绝大多数编译器的短路是16位.如果完全合理的话,我可能会使用一个位字段来完成这项工作:

struct { 
    unsigned short my_number : 16;
};
Run Code Online (Sandbox Code Playgroud)

在一个short16位的典型情况下,这不会产生任何开销 - 并且在极少数情况下需要插入一些额外的代码来将值钳位到正确的范围,这将自动处理.

唯一的缺点是你只能在一个内部有一个位域struct.

编辑:很遗憾@earlz删除了他的答案,因为他的想法实际上比他想象的更好:如果C99实现具有16位无符号整数类型,则需要提供uint16_t该类型的typedef.如果提供,则必须正好是16位宽.还有一个uint_least16_t符合他的描述(至少16位宽,但可能更多).