百科问答小站 logo
百科问答小站 font logo



为什么c51编程多用unsigned char/int? 第1页

  

user avatar   bei-ji-85 网友的相关建议: 
      

看了一圈,没有正确答案。

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一样的带符号比较和不带符号比较跳转。




  

相关话题

  串口屏用起来难吗? 
  单片机为什么能直接烧录程序? 
  如何将 usb 键盘信号转成 ps/2 信号? 
  感觉stm32太简单是一种自负吗? 
  为什么在项目中要尽量避免使用浮点数,不使用浮点数,那该如何计算浮点数? 
  为什么网上连开源的stm32 8个串口程序都没有? 
  可不可以用单片机进行单片机编程? 
  结果相同但段基址不同物理地址是同一地址吗? 
  为什么c51编程多用unsigned char/int? 
  为什么c51编程多用unsigned char/int? 

前一个讨论
x86指令集通过uops解码后通过RISC内核执行,是不是代表x86实际上已经属于半个RISC核?
下一个讨论
顶替上大学的人,化名「陈秋霞」,她们这些年两个人是怎么共用一个身份证号码的?





© 2024-12-23 - tinynew.org. All Rights Reserved.
© 2024-12-23 - tinynew.org. 保留所有权利