今天遇到一个问题,先还原一下场景:开始时,使用32位有符号数作被除数,16位无符号数做除数,计算结果正确;然而,将除数换为32位无符号数则出现异常。代码如下

#include <stdint.h>
#include <stdio.h>
int main(void){int32_t a=-0x1000;uint16_t b=0x50;uint32_t c=0x50;float result;result = a / b;printf("a / b = %f\r\n", result);result = a / c;printf("a / c = %f\r\n", result);return 0;
}

运行结果:

a / b = -51.000000
a / c = 53687040.000000

为什么同样数值为0x50的除数,类型为uint16除得得结果正确,而类型为uint32除得的结果则异常呢?

现象看起来也许很奇怪,不过仔细一想就会明白为什么了。

首先观察变量a和变量b,变量a是长度为32位的带符号整数,b是长度为16位的无符号整数。C语言规定,不同类型变量进行运算,小数值的数会自动隐式转换为大数值类型,这里的a / b的运算当中,由于b的类型小于a的类型,所以,b被隐式转换为与a想同的类型,并进行运算,运算时相当于执行(-0x1000 / 0x50)。

接下来对比变量a和变量c,变量a是长度为32位的带符号整数,b是长度为32位的无符号整数。这里由于变量a与变量b长度想同但符号不同,C语言规定,带符号数与不带符号数向运算,带符号数将优先转成不带符号数,所以,变量a将被转换成无符号数,运算时相当于执行(0xFFFFF000 / 0x50);

最后总结一下:

在指定算数运算操作时,一定要避免使用不同类型的数直接运算,如果情景特殊要求必须使用不同类型运算,则赢显示类型转换后在运算。避免出现意料之外的运算结果。

有符号整数除以无符号整数会发生什么??!!!相关推荐

  1. C++ 有符号整数和无符号整数修饰符之间的差别

    #include <iostream> using namespace std;/* * 这个程序演示了有符号整数和无符号整数之间的差别 */ int main() {short int ...

  2. 有符号整数与无符号整数相加问题

    运行下面代码,输出的结果是: #include<stdio.h>int main() {unsigned int a = 1;signed int b = -3;int c;(a + b ...

  3. python中定义无符号整数_如何在python中将有符号整数转换为无符号整数

    假设: >你有2'补码表示;和, > By(unsigned long)表示无符号32位整数, 那么你只需要向负值添加2 ** 32(或1 <<32). 例如,将此值应用于-1 ...

  4. python中定义无符号整数_在python中如何将有符号整数转换为无符号整数

    要获得与C类型转换相等的值,只需按位并使用适当的掩码.e. g.如果unsigned long是32位:>>> i = -6884376 >>> i & 0 ...

  5. 有符号整数与无符号整数相加问题【转】

    (转自:https://blog.csdn.net/tkp2014/article/details/48500249) 题目1 #include<stdio.h> int main( ) ...

  6. python将有符号整数转为无符号整数

    方法一.int.from_bytes(v.to_bytes) # 将占1字节的小端有符号数-43转换成无符号数小端整数213 int.from_bytes((-43).to_bytes(1, 'lit ...

  7. 在计算机中无符号整数和有符号整数,无符号整数和有符号整数怎么区分?

    有无符号的整数,在计算机内存中是区别不出有无符号的,而是在程序里有区分.计算机中数据是以补码形式存放的,用二进制表示.比如:默认无符号型,只要在类型符号加unsigned就是无符号型,Int是有符号的 ...

  8. C# 有符号整数 无符号整数

    简单来讲: 有符号整数:即有正号和负号 无符号整数:即只有正号没有负号 举个例子,16位整型数 int i; i 为有符号整数,取值范围:-32768--32767 unsigned int j; j ...

  9. 无符号整数与有符号整数相加问题

    #include<stdio.h>#include<string.h>int main(void){unsigned j = 10;int i = -20;printf(&qu ...

最新文章

  1. 卸载Notepad++!事实已证明,它更牛逼……
  2. MAC: Homebrew(代替yum)安装
  3. 优秀的词云展示第三方库——wordcloud
  4. java---数字排序
  5. python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估
  6. 查看线上环境中的jvm参数
  7. 汇编语言——《子程序应用(数制转换)程序设计》实验报告
  8. springboot属性注入
  9. 共阴极数码管编码表_数码管循环点亮的PLC控制——基本逻辑指令的应用
  10. Spark SQL概念学习系列之Spark Shark是什么?
  11. 安徽计算机技术学院蚌埠,安徽蚌埠技师学院2021年招生简章
  12. Matlab机器学习入门(一)
  13. 韩立刚计算机网络——第四章:网络层
  14. 计算机网络技术实训室管理制度,计算机实验室管理制度
  15. 网易美学-系统架构系列1-分布式与服务化
  16. 美团服务器不稳定号码保护,美团外卖怎么开启号码保护 隐藏自己手机号这么设置...
  17. MyBatis课堂笔记
  18. JDK,JRE以及JVM三者之间的关系
  19. 5分钟解决阿里云oss对象存储
  20. JavaScript 设置放大镜效果

热门文章

  1. 怎么把webm转换成mp4?步骤教程
  2. 东方梦符祭服务器维护能玩吗,东方梦符祭新手经营攻略 东方梦符祭怎样玩
  3. android开发网站的流程图,Android_客户端开发流程图及案例.pdf
  4. 组合逻辑电路的设计:竞争和险象
  5. 物联网云平台—物联网背后的掌舵者?
  6. 操作系统-用信号量解决过独木桥问题
  7. 银联进件渠道教程-云闪付收银台最新方法(可对接易支付)
  8. 数据结构与算法(C语言版)----运动会管理系统
  9. 在php中.=什么意思,在算法中mod是什么意思?
  10. python-货币转换