百科问答小站 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一样的带符号比较和不带符号比较跳转。




  

相关话题

  为什么51单片机编程喜欢用unsigned(无符号)类型定义变量呢直接用 int.char..不好吗? 
  为什么在项目中要尽量避免使用浮点数,不使用浮点数,那该如何计算浮点数? 
  结果相同但段基址不同物理地址是同一地址吗? 
  如何防止电脑被单片机(外接电源)烧坏? 
  DSP28335 FlashAPI 编程地址范围是多少? 
  CPU不满载的时候,晶体管在干什么? 
  为啥有好多人说Arduino是玩具? 
  如何实现stm32运行sd卡里的程序? 
  为什么我用51单片机参加比赛会被嘲笑? 
  我国已掌握50纳米以上的芯片工艺,是否已经大量采用国产单片机等其他低端芯片的国产集成电路(IC)? 

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





© 2024-11-14 - tinynew.org. All Rights Reserved.
© 2024-11-14 - tinynew.org. 保留所有权利