有符号整数除以无符号整数会发生什么??!!!
今天遇到一个问题,先还原一下场景:开始时,使用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);
最后总结一下:
在指定算数运算操作时,一定要避免使用不同类型的数直接运算,如果情景特殊要求必须使用不同类型运算,则赢显示类型转换后在运算。避免出现意料之外的运算结果。
有符号整数除以无符号整数会发生什么??!!!相关推荐
- C++ 有符号整数和无符号整数修饰符之间的差别
#include <iostream> using namespace std;/* * 这个程序演示了有符号整数和无符号整数之间的差别 */ int main() {short int ...
- 有符号整数与无符号整数相加问题
运行下面代码,输出的结果是: #include<stdio.h>int main() {unsigned int a = 1;signed int b = -3;int c;(a + b ...
- python中定义无符号整数_如何在python中将有符号整数转换为无符号整数
假设: >你有2'补码表示;和, > By(unsigned long)表示无符号32位整数, 那么你只需要向负值添加2 ** 32(或1 <<32). 例如,将此值应用于-1 ...
- python中定义无符号整数_在python中如何将有符号整数转换为无符号整数
要获得与C类型转换相等的值,只需按位并使用适当的掩码.e. g.如果unsigned long是32位:>>> i = -6884376 >>> i & 0 ...
- 有符号整数与无符号整数相加问题【转】
(转自:https://blog.csdn.net/tkp2014/article/details/48500249) 题目1 #include<stdio.h> int main( ) ...
- python将有符号整数转为无符号整数
方法一.int.from_bytes(v.to_bytes) # 将占1字节的小端有符号数-43转换成无符号数小端整数213 int.from_bytes((-43).to_bytes(1, 'lit ...
- 在计算机中无符号整数和有符号整数,无符号整数和有符号整数怎么区分?
有无符号的整数,在计算机内存中是区别不出有无符号的,而是在程序里有区分.计算机中数据是以补码形式存放的,用二进制表示.比如:默认无符号型,只要在类型符号加unsigned就是无符号型,Int是有符号的 ...
- C# 有符号整数 无符号整数
简单来讲: 有符号整数:即有正号和负号 无符号整数:即只有正号没有负号 举个例子,16位整型数 int i; i 为有符号整数,取值范围:-32768--32767 unsigned int j; j ...
- 无符号整数与有符号整数相加问题
#include<stdio.h>#include<string.h>int main(void){unsigned j = 10;int i = -20;printf(&qu ...
最新文章
- 卸载Notepad++!事实已证明,它更牛逼……
- MAC: Homebrew(代替yum)安装
- 优秀的词云展示第三方库——wordcloud
- java---数字排序
- python线性回归模型预处理_线性回归-2 数据预处理与模型验证评估
- 查看线上环境中的jvm参数
- 汇编语言——《子程序应用(数制转换)程序设计》实验报告
- springboot属性注入
- 共阴极数码管编码表_数码管循环点亮的PLC控制——基本逻辑指令的应用
- Spark SQL概念学习系列之Spark Shark是什么?
- 安徽计算机技术学院蚌埠,安徽蚌埠技师学院2021年招生简章
- Matlab机器学习入门(一)
- 韩立刚计算机网络——第四章:网络层
- 计算机网络技术实训室管理制度,计算机实验室管理制度
- 网易美学-系统架构系列1-分布式与服务化
- 美团服务器不稳定号码保护,美团外卖怎么开启号码保护 隐藏自己手机号这么设置...
- MyBatis课堂笔记
- JDK,JRE以及JVM三者之间的关系
- 5分钟解决阿里云oss对象存储
- JavaScript 设置放大镜效果