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



为什么51单片机编程喜欢用unsigned(无符号)类型定义变量呢直接用 int.char..不好吗? 第1页

  

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

之前已经在别的问题里回答过了,本质原因就是 @星星 答案所举的例子,如果用有符号,会额外需要一条指令来进行符号位的判断。

代码例子不再重复说明了,我就贴两个官方的链接:

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寄存器,核心问题不是这个寄存器更快,也不是因为这个寄存器是第一个寄存器,仅仅是因为这个寄存器的指令比别的更短(所以看上去更快一些),所以主流的编译器都会倾向于优先使用这个寄存器。


user avatar   xiyue-han 网友的相关建议: 
      

@北极 的这个回答写的非常清晰,奇怪的是为什么还有那么多人扯什么最自然、能多用一位之类的,明明就是为了减少指令长度:

而且,可以动手做一下啊:

       void main() {  unsigned int i = 0;  unsigned int j = 0; // 无符号代码   while(1)  {   j++;   if (j > 100)   {    i++;   }  } }     

把j改成有符号定义,再反汇编:

可以看到改成有符号以后,这个if语句多了一个指令(两个字节,XRL指令)用来判断符号位。这不是少用一个bit的问题,改成有符号,每个条件判断都要多两个字节

这么多回答,为什么没有人动手写代码试试呢?反对回答


user avatar   pansz 网友的相关建议: 
      

之后不再更新这个答案了,

我想说一下最后的事情发展。

让这个事件有头有尾

事情闹得太大了,元气森林被tb约谈。

之后承诺给每一位下单的人补偿一箱15瓶的白桃元气森林,

之后的操作多少也有些神奇,

它的物流单号是单独通过淘宝客服弹出的对话框中的链接点击后,提供自己的淘宝名称和手机号后自动跳转出的。

而在此之前,需要把自己下单的货退款掉。

很厉害呀,

因为退款之后就不能写差评了。


白嫖一箱就是羊毛党的胜利吗?

我不觉得。

反倒依然让我觉得元气森林这个牌子非常的会营销。

哪怕是用卑劣低下的手段。

而这个卑劣低下的手段在整个双11,甚至是接下来的双十二将不停的重现。

如果有加一些私下的群,豆瓣的组就会发现这种事情并不是一家在做,并不是小店玩不起。大店也在跟着做。

诚然如群友所讲,这些事情并不是发生的第1次,但是从影响力和大众的了解度讲,元气森林起了一个非常不好的头。

大众点评的武汉用户,应该知道ZL烤肉是怎么回事吧。一样的,做法一样一样。现在评分好像跌到3.6了吧?

养猫的朋友或许有知道某大店商家的猫粮。原价两三百的,不小心被设置为48块钱一袋,之后也说是运营失误,要求买家退款。

现在回想我第一次回答时贴图的那个迪巧钙片,应该也是被骗了

你说元气森林和这些事情完全没有关系吗?

他真是起了一个“好”头啊。





二次更新

不晓得是不是元气森林看到了这条答案。

淘宝客服发了消息要求退货。

别想了,恶意营销,自导自演,当婊立牌,装可怜卖乖。(越想越气)

我们无缘无故挨一炮骂,你们得到流量和关注度。真是双赢。

何况我不退货,你也没发货。

何来的损失一说?何来损失几百万一说?

钱都在支付宝里呢。

多大的公司了,还卖可怜呢?

→以下原答案。

已经有答案分析的比较客观合理了,

这种事很大概率就是商家的自我营销。

薅了一份,36瓶15块钱。

说实话,你卖惨我也认,

你给我打个电话,发个短信,哪怕是淘宝客服给我留个言呢,你就说我们这怎么怎么样了,确实赔钱,麻烦您退款

那行,我也不是不能退款。

都是打工人,不会互相为难。

但你把这事冲上微博热搜。短信留言什么的也不给我发,然后卖可怜,利用舆论把我们这些薅了羊毛的人进行道德绑架。

我要不是看热搜我都不知道,我现在已经成了薅羊毛没有道德的傻逼了。

退一万步讲,

你工作失误怎么说呢?

已经有人讲了,这种东西很难设置失误,那这是怎么一回事呢?

你的工作失误为什么要让我们来买单?

现在的情况是,

你们卖可怜,工作失误就过去了,

我们退不退单,依然有人骂我们。


这是之前迪巧钙片给我发的短信,

他给我发短信我下一秒就退了呀,这确实是给人家造成麻烦了。

你不跟我这发消息,又卖可怜又让人骂我们,你这个干嘛呢?当婊立牌?

这种态度,现在就是给我发短信,我都不想退了。




  

相关话题

  从事单片机的工作,C语言、电路基础、数字电路、模拟电路分别要掌握到什么程度呢? 
  自制PCI接口的数据采集卡需要啥技术? 
  我国已掌握50纳米以上的芯片工艺,是否已经大量采用国产单片机等其他低端芯片的国产集成电路(IC)? 
  在500-1000元的价位中,有哪些数字示波器推荐吗? 
  纯粹学习嵌入式软件部分,qemu可以代替开发板吗? 
  为什么用现代的单片机还是实现不了以前的红白机那么好的游戏效果? 
  怎么看懂Arduino的电路图? 
  嵌入式linux内核在内存中运行地址0x30008000到内存起始运行地址0x30000000中的(0x8000=32k)怎么回事? 
  如何把算法应用在单片机电路里? 
  C/C++中的数组为什么必须定义之后在一行内立刻赋值,而不能定义数组之后换一行再赋值? 

前一个讨论
会不会有两个中断绝对同时发出,cpu会如何处理?
下一个讨论
页表到底是保存在内核空间中还是用户空间中?





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