c语言各类型数据混合运算

参考1:C语言中的数据类型的隐式转换
参考2:C语言隐式类型转换和整型提升

1. c语言整值提升规则

double ← float ⾼
↑
long
↑
unsigned int
↑
int ← char或short 低
  • 在c语言的运算中,如果两个数据的类型不一样,将会按照上述规则将低级数据类型转换成高级数据类型再运算。
  • 如果表达式(如 算术计算和 关系判断)中的所有数据类型都⼩于int (⼩于int的有 枚举类型,bool、char、unsigned char、short ),则会将这些数据类型全部提升为int或unsigned int,提升后再进⾏表达式计算,计算后再进⾏截断得到最终结果。

2. c语言数据类型隐式转换场景

  • 算术运算时,低级转换为高级数据类型后再运算;
  • 赋值时,右值转换为左值类型;
  • 函数传参时,强制转换成形参类型;
  • 函数返回值时,强制转换为返回值类型;

3. 典型题目

    int i = -2;
    unsigned int j = 1;
    if( (i + j) >= 0 )
    {
        printf("i+j>=0\n"); //结果输出该句
    }
    else
    {
        printf("i+j<0\n");
    }
    printf("i+j=%d\n", i + j);//结果输出-1
    // 原因,i+j隐式转换成了unsigned int类型,肯定大于0;
    // printf打印时又将i+j的结果转换成int类型,所以是-1;
    uint32_t a=3;
    cout << "cout<<a*-1="<< a * -1;//结果4294967293=0xfffffffd
    printf("a * -1 = %d\n", a * -1); //结果-3
    //原因,由于cout是将数据原始类型输出。数字默认是int型,所以-1先转成uint32_t类型后再计算。
    //-3的16机制也是0xfffffffd,由于printf的参数是%d,所以这里又有一个隐式转换。

4. windows下的自测验证

#include <stdio.h>
#include <stdint.h>

void main(void)
{
  int8_t _int8_1 = -1;
  uint8_t _uint8_1 = -1;
  uint8_t _uint8_2 = 1;
  int16_t int16_1 = -1;
  int16_t int16_2 = 2;
  uint16_t uint16_1 = 1;
  int32_t int32_1 = 1;
  uint32_t _uint32_1 = 10;

  printf("_int8_1   < _uint8_1    =%d\n",_int8_1 < _uint8_1);
  printf("_int8_1   > 26          =%d\n",_int8_1 > 26);
  printf("_uint8_1  > 26          =%d\n",_uint8_1 > 26);
  printf("_uint8_1  > -1          =%d\n",_uint8_1 > -1);
  printf("_int8_1   > _uint8_2    =%d\n",_int8_1 > _uint8_2);
  printf("-1        > _uint8_2    =%d\n",-1 > _uint8_2);
  printf("_int8_1   > _uint32_1   =%d\n",_int8_1 > _uint32_1);

  printf("_int8_1   > int16_1     =%d\n",_int8_1 > int16_1);
  printf("_int8_1   > uint16_1    =%d\n",_int8_1 > uint16_1);
  printf("int16_1   > uint16_1    =%d\n",_int8_1 > int16_1);
  printf("int16_1   > int32_1     =%d\n",int16_1 > int32_1);
  printf("int16_1   > _uint32_1   =%d\n",int16_1 > _uint32_1);

}

根据测试结果得出结论:

  • uint32_t的数有符号数变量常数做运算时,是无符号数之间的运算
  • 当uint16_t的数和有符号数变量做运算时,是有符号数之间的运算
  • 当uint64_t的数和常数做运算时,是无符号数之间运算
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值