硬汉嵌入式论坛

 找回密码
 立即注册
查看: 1046|回复: 5
收起左侧

关于C语言 无符号数 和 有符号 数的运算问题

[复制链接]

22

主题

66

回帖

132

积分

初级会员

积分
132
发表于 2023-8-18 09:49:13 | 显示全部楼层 |阅读模式
keil5 stm32 在进行如下代码时   
    unsigned int a = 6;
    int b = -20;
     while(a+b > 1)
    {
       study();
    }  
答案是会进入study 为什么得到的结果是a+b >1 呢? 无符号数和有符号数运算的结果到底是怎样的? 请教一下大家

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-8-18 12:44:01 | 显示全部楼层
看反汇编,有符号转无符号后相加



    55:         unsigned int a = 6;
0x08103C1E 2006      MOVS          r0,#0x06
    56:     int b = -20;
    57:         
0x08103C20 F06F0113  MVN           r1,#0x13
    58:      while(a+b > 1)
    59:     {
0x08103C24 1844      ADDS          r4,r0,r1




回复

使用道具 举报

22

主题

66

回帖

132

积分

初级会员

积分
132
 楼主| 发表于 2023-8-18 13:38:07 | 显示全部楼层
eric2013 发表于 2023-8-18 12:44
看反汇编,有符号转无符号后相加

谢了 硬汉哥  看来下次做运算的时候尽量是相同类型的 不然数据很容易是意想不到的
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-8-21 08:37:35 | 显示全部楼层
本帖最后由 caicaptain2 于 2023-8-21 08:48 编辑
eric2013 发表于 2023-8-18 12:44
看反汇编,有符号转无符号后相加

还不一定都是优先转无符号的。
网上找到个说明:


① 当一个int类型的a与unsigned int类型的b相运算时,例如:a+b的时候,如果直接是a+b的话,各个变量就会隐式转换成为unsigned int的类型再相加。

② 当用print函数指定打印的时候,例如:printf(”%d\n”,a+b),就要各个变量转换为%d的类型再想加。

③ 当用一个int c类型去装这个结果时,如:c=a+b,同理,a和b会根据c的类型去分别转换跟c一致的类型再去运算。
————————————————
版权声明:本文为CSDN博主「杨 戬」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_45525272/article/details/120246756

回复

使用道具 举报

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106678
QQ
发表于 2023-8-21 09:02:09 | 显示全部楼层
caicaptain2 发表于 2023-8-21 08:37
还不一定都是优先转无符号的。
网上找到个说明:

对,看反汇编就行,比较省事。
回复

使用道具 举报

334

主题

2032

回帖

3039

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3039
发表于 2023-11-28 15:53:19 | 显示全部楼层
你可以改个写法,就应该正常了。

unsigned int a = 6;
    int b = -20;
int c;
c= a+b;  //这里c的类型很重要。 因为它是个有符号的,所以结果就是-14
     while(c  > 1)
    {
       study();
    }  
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-4-29 09:02 , Processed in 0.174956 second(s), 26 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

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