看了一圈,没有正确答案。
51单片机没有有符号操作指令,也没有判断溢出的指令,所有的指令都是无符号的,所以默认都是unsigned类型的。
如果要操作有符号的话,需要额外检查最高位,来判断是否有符号,指令会多一条。
对于51这种板子来说,内存可能是1K甚至几百字节,所以指令能省就省吧。
随便找了一个指令手册的链接:
判断符号的话,就得用类似:JNB ACC.7 这种,多一条指令专门判断高位,得不偿失。
对于x86汇编就不一样,x86汇编语言里
JA (无符号比较)的编码是2字节(编码:77 cb),JG(有符号比较)的编码也是2字节(编码:7F cb),有符号无符号的比较指令开销是一样的,并且有OF这个flag,所以PC端开发软件,用有符号还是无符号没什么差别。
其它回答里说,嵌入式里,用unsigned会获得更大的数据范围之类的,这些都是结果而不是原因。
如果一个代码,变量只使用了127以内的数字,那么是否推荐使用有符号的char呢?
用char而不是unsigned char的话,对于编码者来说,少写几个字符应该是更方便的。但对于编译器来说,就不友好了:凡是做变量比较的地方,都会多出一条符号位的比较,汇编代码占用空间更多。
C51设计的时候,不支持有符号操作,C51的最初的demo和早期的代码样例也都是unsigned的,后人学习的时候自然也就成了习惯了。
至于说用不到负数的,其实原因是对负数支持的不好,所以就不用了。很多嵌入式平台上没浮点支持,嵌入式平台很少直接用浮点,不能把原因和结果反过来。
稍微“高级”一点的CPU,都是支持有符号指令的,比如ARM也有跟x86一样的带符号比较和不带符号比较跳转。