找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
12
返回列表 发新帖
楼主: censv
打印 上一主题 下一主题
收起左侧

表现奇怪的C语言0x80 正数?负数?bug?

  [复制链接]
41#
ID:384109 发表于 2022-9-26 18:58 | 只看该作者
censv 发表于 2022-9-26 18:00
那你的意思是常量没有类型?

不是常量没有类型,而是类型不分常量或变量,否则有符号数怎么和负数常量做比较
回复

使用道具 举报

42#
ID:1043747 发表于 2022-9-29 13:51 | 只看该作者
人中狼 发表于 2022-9-26 18:58
不是常量没有类型,而是类型不分常量或变量,否则有符号数怎么和负数常量做比较

我问 0x80 常量是什么类型,你说 这样问是偏了,你的偏了是什么意思?
你又说,常量不是没有类型,那你意思就是常量可能有类型。那常量什么情况下有类型?什么情况下没有?
回复

使用道具 举报

43#
ID:59202 发表于 2022-9-29 17:02 | 只看该作者
楼主不是偏了,是有探究精神,但还需要多多努力学习,我们大家都是这样走过来的。对于0x80,我们回归本质在单片机中就是10000000,它可以是指令也可以是数据。而做为数据在编译软件的眼里它也是多种可能,你规定它是无符号数char它就是128,你规定它是有符号char它就是-128,甚至如果编译软件里有规定它还可以表示浮点数,这都不奇怪。我们学习c语言就要遵循它的规定,你违反了它的规定就会得到错误的结果这很正常
回复

使用道具 举报

44#
ID:392485 发表于 2022-9-29 17:47 | 只看该作者
你把0x80放到 char型和int型中结果是不一样的。定义成int型之后结果就不一样了,因为第8位在char型中是个特殊位,在移位的时候会先看是做为正数处理还是作为符号位处理。keil是8位机的C语言。
回复

使用道具 举报

45#
ID:146878 发表于 2022-9-30 01:10 | 只看该作者
是keil没按C标准,楼主按C标准了?
编译器只要不明写“该语句不是合法C语言”,那就是合法了。编译不出来是编译器的问题。
楼主说了写常量0x80就应该是正数,大家记住,无论身处何地它就是正数,以后开发编译器,别乱猜类型。

回复

使用道具 举报

46#
ID:146878 发表于 2022-9-30 01:20 | 只看该作者
censv 发表于 2022-9-26 18:00
那你的意思是常量没有类型?

常量可以有数据类型,但是你得表明是什么类型。不然编译器不知道你要做什么类型。你不标明,那编译器只能根据你的表达式去猜测你写的常量是什么类型。
回复

使用道具 举报

47#
ID:146878 发表于 2022-9-30 01:29 | 只看该作者
censv 发表于 2022-9-14 06:15
if当然是判断真假,a != x80,因为a表示为负数,不等于正数的字面量0x80,是对的。
但在第二个例子,0x8 ...

这样理解 != ,头回见,头回见。
。。。。。我没说你理解的是错的或怎么的,只是这理解方式,,头回见。哈哈哈。
回复

使用道具 举报

48#
ID:146878 发表于 2022-9-30 01:55 | 只看该作者
我送楼主个例子,相信楼主会更加坚信自己的见解,keil有bug,这么多年无人发现?
void main(void)
{
  signed char    a = 0x80;
  unsigned char b = 0x80;
  while(1)
  {
  if(a==b)
    LED0= 1; //如果进这里,那就是keil出bug了,啊哈哈哈哈哈。
  else
    LED0= 0;
  if(a>0)
    LED1= 1;
  else
    LED1= 0;
  if(b>0)
    LED2= 1;
  else
    LED2= 0;
    a++;
    b++;
  }
}
回复

使用道具 举报

49#
ID:740383 发表于 2022-9-30 10:22 | 只看该作者
xxxevery 发表于 2022-9-29 17:02
楼主不是偏了,是有探究精神,但还需要多多努力学习,我们大家都是这样走过来的。对于0x80,我们回归本质在 ...

无符号范围char是0-255,,有符合范围char是-128~+128,这里如果是数据,就是128,怎么规定它是浮点?它现在表示的是整数,换算十进制:128,想要定义为浮点float或者Double还需要加小数点:128.0,并且也不是你这样描述的!盲猜楼主是想使用unsigned char与或运算,但是没有&清零多余位.......
回复

使用道具 举报

50#
ID:1043747 发表于 2022-9-30 16:46 来自手机 | 只看该作者
我在此声明一下,不要把0x80复制给变量,再来讨论变量。这种讨论和问题无关
回复

使用道具 举报

51#
ID:740383 发表于 2022-10-5 10:19 | 只看该作者
服,LED引脚初始化了吗???输入?输出?准双向?推挽?LED:0点亮还是1点亮???先不说定义,代码本身就有问题
回复

使用道具 举报

52#
ID:275826 发表于 2022-10-7 07:22 | 只看该作者
0x80在没有赋值给变量之前就是整形常量,是正数128
回复

使用道具 举报

53#
ID:275826 发表于 2022-10-7 07:25 | 只看该作者
pdwdzz 发表于 2022-9-30 01:55
我送楼主个例子,相信楼主会更加坚信自己的见解,keil有bug,这么多年无人发现?
void main(void)
{

C51的关系运算==编译成XRL,是有bug
回复

使用道具 举报

54#
ID:526108 发表于 2022-10-7 08:23 | 只看该作者
188610329 发表于 2022-9-12 11:49
正负数,是人为划定的一个范围,你要判断正负,也是应该用if(a

0x80是常量,常量都已unsigned处理
回复

使用道具 举报

55#
ID:526108 发表于 2022-10-7 08:35 | 只看该作者
常量都是以unsigned处理
常量<常量 == unsigned<unsigned

变量比较都是以变量作为单位
unsigned char<常量 == unsigned char<unsigned char
char<常量 == char<char

反汇编可以看这两条c语言所编译出来的汇编指令是不一样的
回复

使用道具 举报

56#
ID:384109 发表于 2022-10-7 14:41 | 只看该作者
不管常量还是变量,都是先定义类型,再定义数值的,而且编程语言里还有隐性规则的,为什么正数128我们不用写正号,就是因为隐性约定只有负数要写符号,楼主一再强调0X80是什么数,确一直不能理解是需要先定义数据类型的,这个无法理解楼主为啥想不通,而且又看了楼主的例子,第一个例子if(a != 0x80),这是一个比较两个数是否相同而已,又不在于是否有符号
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表