我必须检查规范以了解究竟是什么依赖于实现的问题。然而,我在(咕哝)多年的嵌入式系统项目中使用的每一个实现都是明智的:
实现提供两种转换是有意义的,因为两者都很有用,并且使用有符号/无符号来选择意味着是一个明智的选择。
编辑:至少绝对依赖于实现的一件事是C标准没有(完全)指定整数的底层实现及其存储。例如,可以为使用补码算法的机器构建兼容的 C 编译器。也有可能(我认为)为一台机器构建一个兼容的编译器,它的本机存储是有符号 BCD 大小的。(不,我错了,见下文。)
在实践中,世界几乎已经确定了 CPU 的二进制补码,并且一些迂腐的问题正在讨论中。
所以问题的一部分实际上是:如何以稳定的方式定义 << 和 >> 运算符的含义,而不管使用的底层算术系统如何。
IIRC, 的定义n<<1
是有效n*2
的,n>>1
是有效n/2
的, 具有超过 1 的自然扩展(但不超过 31...那里有未定义的龙...) 并且>>
操作员将保留如果对有符号值进行操作,则为符号。
编辑 2: Pete Kirkham 在他的好回答中指出,C 标准确实特别禁止整数的 BCD 表示的可怕情况,无论它是有符号的幅度还是十的补码。我确信这是一件好事,即使 Knuth 在早期版本的The Art of Computer Programming中确实使用(可选)BCD 机器作为他的示例代码。
在那些 BCD 是正确答案的罕见用例中,然后将它们存储在无符号长整数(8 位十位补码)或无符号 64 位整数(16 位十位补码或 15 位加号和标志的空间)中,并使用精心设计的算术库来操作它们是有意义的。
当然,在实践中,C 实现将操作符按照标准允许的方式直接映射到 CPU 的本机机器指令。编写标准的人非常注意存在许多方法来实现甚至简单的事情,比如整数值的表示,而 C 标准反映了这一点,通过允许足够的实现定义的行为来让运算符在每个机器。
替代方案迅速导致所有数学运算都完全指定的世界,并且无法在任何机器上有效地实现。