之前已经在别的问题里回答过了,本质原因就是 @星星 答案所举的例子,如果用有符号,会额外需要一条指令来进行符号位的判断。
代码例子不再重复说明了,我就贴两个官方的链接:
The 8051 family of processors does not specifically support operations with signed numbers. The compiler must generate additional code to deal with sign extensions.
翻译:
8051系列处理器不(明确地)支持有符号数的操作。编译器必须要生成额外的指令来处理有符号扩展。
As part of the optimization process, the compiler attempts to maintain local variables in registers. Register access is the fastest type of memory access. The best effect is normally achieved with unsigned char and unsigned int variable types.
翻译:
作为优化的一部分,编译器会尝试使用寄存器保存局部变量。寄存器访问是最快的内存访问方式。最好的效果通常是使用无符号char或者无符号int类型。
以上是最权威的官方信息,其它的理由都比较勉强。
不管是“可以用更大数据范围”,还是“移位操作更友好”的理由,都无法解释:为什么要尽可能用unsigned?如果变量数值范围就不需要那么大呢?如果不需要循环移位呢?如果某个变量的高位在整个代码生存周期内确实一直是0呢?
所以,其它的“原因”,其实都是“结果”,硬件不支持,才是原因。
同样的,在x86的汇编里,会更频繁的使用ax/eax/rax寄存器,核心问题不是这个寄存器更快,也不是因为这个寄存器是第一个寄存器,仅仅是因为这个寄存器的指令比别的更短(所以看上去更快一些),所以主流的编译器都会倾向于优先使用这个寄存器。
@北极 的这个回答写的非常清晰,奇怪的是为什么还有那么多人扯什么最自然、能多用一位之类的,明明就是为了减少指令长度:
而且,可以动手做一下啊:
void main() { unsigned int i = 0; unsigned int j = 0; // 无符号代码 while(1) { j++; if (j > 100) { i++; } } }
把j改成有符号定义,再反汇编:
可以看到改成有符号以后,这个if语句多了一个指令(两个字节,XRL指令)用来判断符号位。这不是少用一个bit的问题,改成有符号,每个条件判断都要多两个字节。
这么多回答,为什么没有人动手写代码试试呢?反对回答。
本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度,google,bing,sogou 等
© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有