数码之家

 找回密码
 立即注册
搜索
查看: 3376|回复: 39

C语言奇怪的问题:%运算符

[复制链接]
发表于 2021-9-7 12:38:59 | 显示全部楼层 |阅读模式
显示为3456,正确
显示为3056,错误
显示为1234,正确
显示为2045,错误
我对于运算符的理解不是很透彻,请教大神,导致错误结果的原因是什么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
发表于 2021-9-7 12:50:12 | 显示全部楼层
各变量的数据类型是什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 12:59:17 | 显示全部楼层
freemancn 发表于 2021-9-7 12:50
各变量的数据类型是什么?

unsigned char Data1;                 
unsigned char Data2;                 
unsigned char Data3;            
unsigned char Data4;
unsigned int adc;
回复 支持 反对

使用道具 举报

发表于 2021-9-7 12:59:22 | 显示全部楼层
咱们先搞清楚/和%。
这里就这样说好了:比如3456/100,就是在百位那边切一刀,取出高位的数。3456/100差不多就是34/56,你看切一刀了,取出34。
                                3456%100呢?也是在同样的地方切一刀,不过是取低位的数。34%56,这把刀不太一样。取出56。
adc=3456;
Data2=(adc%10)/100;// 你看3456%10,切了之后就是345%6,取出6了,6/100再切,这可怎么切呢,没得切了,所以就是0了。
adc=2345;
Data2=adc/100;           //2345/100,切了之后是23/45,取出了23。然后你实际显示的是0,你这个应该是数码管或者其他单个位显示的,可能是你显示数组里的第23个数据刚好就是0,或者溢出了。

回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-9-7 13:01:50 | 显示全部楼层
本帖最后由 iritwq 于 2021-9-7 13:05 编辑
chenppo 发表于 2021-9-7 12:59
咱们先搞清楚/和%。
这里就这样说好了:比如3456/100,就是在百位那边切一刀,取出高位的数。3456/100差不 ...

但是1234就显示正确了呀显示程序是这样的,data1-4的值在子程序中就是X的值:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-9-7 13:04:05 来自手机浏览器 | 显示全部楼层
你这Data2都是错的
Data2=(adc/100)%10
或者是
Data2=(adc%1000)/100
都可以。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:07:51 | 显示全部楼层
本帖最后由 iritwq 于 2021-9-7 13:09 编辑
chenppo 发表于 2021-9-7 12:59
咱们先搞清楚/和%。
这里就这样说好了:比如3456/100,就是在百位那边切一刀,取出高位的数。3456/100差不 ...

改成这句可以显示为3了:Data2=adc/100%10;改成这样显示都能正确:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

发表于 2021-9-7 13:13:27 来自手机浏览器 | 显示全部楼层
Data2=(adc%10)/100这是3456除以10取余再除以100就是=6/100结果为0
Data2=adc/100结果是1234/100=12    2345/100=23看似有个2其实也是错误的
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:15:13 | 显示全部楼层
widkzdwitm 发表于 2021-9-7 13:04
你这Data2都是错的
Data2=(adc/100)%10
或者是

Data2=(adc%1000)/100这个不行
回复 支持 反对

使用道具 举报

发表于 2021-9-7 13:18:36 | 显示全部楼层
iritwq 发表于 2021-9-7 13:07
改成这句可以显示为3了:Data2=adc/100%10;改成这样显示都能正确:

:shocked:草率了,你竟然不用数组,直接位操作。1位单片机嘛?:lol:
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:22:28 | 显示全部楼层
chenppo 发表于 2021-9-7 13:18
草率了,你竟然不用数组,直接位操作。1位单片机嘛?

请指教一下:handshake:,我开始自学的汇编,没有基础,C也是学会之后做小东西时用用,感觉用C的时候汇编的影子很重
回复 支持 反对

使用道具 举报

发表于 2021-9-7 13:22:47 | 显示全部楼层
你换个机器或者系统试试,没准结果就变了。
回复 支持 反对

使用道具 举报

发表于 2021-9-7 13:23:52 | 显示全部楼层
除法运算如果参加运算的数据都为整形 结果为整形.如果参加运算的整形变量为不同长度的整形则以最长的类型作为表达式结果,注意是表达式结果.然后表达式结果再参加赋值运算那么还要做强制类型转换.因为Data为 unsigned char.参加运算的常量是int型.

Data2 = (adc % 10) / 100实际运算过程是 Data2 = 6 / 100 然后 Data2 = 0.

另外你使用的是什么编译器? 主要是编译器有大小端的问题. Keil和SDCC的大小端设定就不一样.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:24:54 | 显示全部楼层
chenppo 发表于 2021-9-7 13:18
草率了,你竟然不用数组,直接位操作。1位单片机嘛?

这种做法我试过,但是不行:比如显示0,P1=0XOO;P2=0X0E;P3=0X00;结果闪烁非常厉害
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:25:54 | 显示全部楼层

nnbuchicao 发表于 2021-9-7 13:22
你换个机器或者系统试试,没准结果就变了。

遇到过,怎么样才能保证结果不会改变?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:27:12 | 显示全部楼层
freemancn 发表于 2021-9-7 13:23
除法运算如果参加运算的数据都为整形 结果为整形.如果参加运算的整形变量为不同长度的整形则以最长的类型作 ...


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:32:13 | 显示全部楼层
freemancn 发表于 2021-9-7 13:23
除法运算如果参加运算的数据都为整形 结果为整形.如果参加运算的整形变量为不同长度的整形则以最长的类型作 ...

这个问题现在是搞清楚了,我当时是把adc%100和adc/100搞混了。但是又出了新问题:adc%1000/100为什么又不行?我的理解是ADC=3456,ADC%1000=456,456/100=4,但是试了几次,有时结果为0,有时结果为3,我都晕了
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-9-7 13:34:56 | 显示全部楼层
每句下面加个printf不就可以看出来了么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:36:54 | 显示全部楼层
widkzdwitm 发表于 2021-9-7 13:13
Data2=(adc%10)/100这是3456除以10取余再除以100就是=6/100结果为0
Data2=adc/100结果是1234/100=12    234 ...

问题是有的数字能显示正确。如果都显示不对我能想通,搞不清为什么有时能显示对
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-7 13:47:01 | 显示全部楼层
高级会员 发表于 2021-9-7 13:34
每句下面加个printf不就可以看出来了么?

关键是弄不清运算的结果为什么和预期的不一样
回复 支持 反对

使用道具 举报

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

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2025-5-21 21:22 , Processed in 0.171600 second(s), 10 queries , Redis On.

Powered by Discuz!

© 2006-2025 MyDigit.Net

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