Q: 下面的代码输出是什么,为什么?

void test(void)
{unsigned int a = 6;int b = -10;((a + b) > 0) ? printf("a + b > 0\r\n") : printf("a + b < 0\r\n");printf("a + b = %d\r\n", a + b);
}

A:

废话,输出是:

a + b < 0
a + b = -4

但是,上机实际跑一跑,真的是这样的吗?

编写程序如下:

#include <stdio.h>
#include <stdlib.h>void test(void) {unsigned int a = 6;int b = -10;((a + b) > 0) ? printf("a + b > 0\r\n") : printf("a + b < 0\r\n");printf("a + b = %d\r\n", a + b);printf("b 的整形:%d\r\n", b);printf("b 的无符号整形:%u\r\n", b);printf("b 的十六进制表达:%x\r\n", b);
}int main(void)
{test();printf("INT_MAX:%d\r\n", INT_MAX);printf("INT_MIN:%d\r\n", INT_MIN);printf("UINT_MAX:%u\r\n", UINT_MAX);system("pause");return 0;
}

程序运行完成后的输出如下:

a + b > 0
a + b = -4
b 的整型:-10
b 的无符号整型:4294967286
b 的十六进制表达:fffffff6
INT_MAX:2147483647
INT_MIN:-2147483648
UINT_MAX:4294967295

为什么会有这样的结果?

这个问题测试你是否懂得 C 语言中的整数自动转换原则,原因是当表达式中存在有符号类型和无符号类型时,所有的操作数都自动转换为无符号类型。因此 -10 变成了一个非常大的正整数,所以程序输出的结果是 a + b > 0。这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。

那么 -10 究竟被转换为了几呢?

如下图所示,在程序中打断点,在左侧的监视区可以看到,此时 a 的值为 6b 的值为 -10,但是 a + b 的值为 4294967292

所以此时 b 的值为 4294967286,它等于 4294967295 - 9,从上面的输出的结果可以验证,有符号类型的 b 被自动转换为无符号类型.

扩展:int的最大值和最小值和uint的最大值

limits.h 这个文件中,有如下的宏定义:

#define INT_MIN     (-2147483647 - 1)
#define INT_MAX       2147483647
#define UINT_MAX      0xffffffff

C语言学习笔记-有符号数和无符号数相加的问题相关推荐

  1. C语言中的有符号数和无符号数之间转换

    C语言中的有符号数和无符号数之间转换 我们都知道C语言中有有符号数和无符号数两种整数表示方法,并且支持相互转换. 那么具体相互转换有什么规则,我们今天来了解一下: 在C语言中当声明一个像12345或0 ...

  2. C++中含有无符号类型的表达式——有符号数与无符号数相加

    首先,明确一个概念,什么是有符号数,什么是无符号数.以整型为例,int 类型的既可以表示正整数,又可以表示负整数,所以是有符号数.unsigned  int 只可以表示正整数,所以成类似的数为无符号数 ...

  3. c语言中的有符号数和无符号数

    首先看一个程序: void main() {     short sdata1=-1; unsigned short sdata2=1; int data1=-1;     unsigned int ...

  4. 关于汇编中有符号数和无符号数的判断

    首先给一段代码 1 #include <stdio.h> 2 int main() 3 {unsigned int x=9; 4  int y=-20; 5  int m=(x+y> ...

  5. 有符号数和无符号数的区别

    C语言允许我们定义有符号数和无符号数,例如一个字节的存储空间,我们可以定义成unsigned char,也可以定义成signedchar,但是你知道它们的区别吗?你知道它们是怎样被存储,又怎样被区分处 ...

  6. Verilog学习笔记——有符号数的乘法和加法

    有符号数的计算在 Verilog 中是一个很重要的问题(也很容易会被忽视),在使用 Verilog 语言编写 FIR 滤波器时,需要涉及到有符号数的加法和乘法,在之前的程序中我把所有的输入输出和中间信 ...

  7. java中有符号数和无符号数,C语言中无符号数和有符号数之间的运算

    C语言中有符号数和无符号数进行运算(包括逻辑运算和算术运算)默认会将有符号数看成无符号数进行运算,其中算术运算默认返回无符号数,逻辑运算当然是返回0或1了. unsigned int和int进行运算 ...

  8. c语言中的无符号字节,C语言之有符号数和无符号数

    我们知道,在C语言中存在无符号数和有符号数(一些高级语言如Java里面是没有无符号数的),但是对于计算机而言,其本身并不区别有符号数和无符号数,因为在计算机里面都是0或者1,但是在我们的实际使用中有时 ...

  9. C语言中 有符号数、无符号数、整数溢出

    #include<stdio.h> void main() {int l=-1;unsigned int c=135; printf("%u\n",l+c); } 这个 ...

最新文章

  1. GlusterFS的安装及使用
  2. 模拟电路推荐学习书单
  3. mysql主从及读写分离
  4. fso 拒绝访问_java.sql.sql异常:用户“asus”@“localhost”的访问被拒绝(使用密码:YES)...
  5. python图片内容长度识别_教你如何用几行Python代码识别图片文字--就是这么简单!...
  6. 布线干货 | 线缆截面积的测量标准
  7. OpenCASCADE:使用扩展数据交换 XDE之剪裁平面
  8. 小红书shield算法分析
  9. 前端学习(2260)高校案例
  10. ZooKeeper -- API文档
  11. 下载丨Oracle 11g 安装后参数规范设置
  12. 百度安全DDoS攻击年度报告出炉 企业防护有新招!
  13. 如何将用户迁移到SQL Server中的部分包含的数据库
  14. linux 快捷matlab_ubuntu下Matlab_Linux添加工具包操作步骤
  15. 数据结构与算法的分析 —— 渐进复杂度(三个记号)
  16. springboot快速搭建图书管理系统
  17. Apple pay 论述
  18. 怎么把mov格式转换成mp4?
  19. 国产操作系统有哪些,你知道吗?
  20. 计算机中c盘标准规划为什么,为什么电脑c盘老是很小的空间··定期清理了

热门文章

  1. 判断通过微信、支付宝扫一扫进入的页面
  2. 利用压缩文件修改加密word文档
  3. GStreamer播放教程05——色彩平衡
  4. MySQL分配内存多少合适_mysql 如何分配内存
  5. 客户端 cloudera-scm-agent启动报错
  6. 提升机器算法LightGBM(图解+理论+增量训练python代码+lightGBM调参方法)
  7. 使用Matlab来生动展示一阶二阶电路的情况
  8. Mycat个人心得笔记(一)
  9. Dockerfile unable to access ‘.git/‘: Failed to connect to gitlab.com
  10. 学习机器学习的最佳路径是什么