强制类型转换问题

  在c++中,当把一个表示范围更大的类型的数值a赋值给一个表示范围更小的类型时,会自动进行强制类型转换,转化为范围表示更大的类型。

  转换的规律是,这里假定较小的类型表示的数值的个数为n。转化后的值为a模n后的余数。

  对于整型数a,b来说,取模运算或者求余运算的方法都是:

  1.求 整数商: c = a/b;

  2.计算模或者余数: r = a - c*b.

  求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。

  例如:计算-10 Mod 4 那么:a = -10;b = 4;

  第一步:求整数商c,如进行求模运算c = -3(向负无穷方向舍入),求余c = -2(向0方向舍入);

  第二步:计算模和余数的公式相同,但因c的值不同,求模时r = 2,求余时r = -2。

  归纳:当a和b符号一致时,求模运算和求余运算所得的c的值一致,因此结果一致。

  当符号不一致时,结果不一样。求模运算结果的符号和b一致,求余运算结果的符号和a一致。

  另外各个环境下%运算符的含义不同,比如c/c++,java 为取余,而python则为取模。

  

1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5     unsigned u=10;
6     int i=-11;
7     cout<<u+i<<endl;
8     return 0;
9 }

  2^32=4294967296,i对4294967296取余得4294967296-11=4294967285

  所以结果为4294967285+10=4294967295

1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5     unsigned u=10;
6     int i=-9;
7     cout<<u+i<<endl;
8     return 0;
9 }

  如上代码,所不同的是,int的值改为-9(看上去绝对值比u小)

  i取余的4294967296-9=4294967287

  所以结果为4294967287+10=4294967297,超过了2^32,所以结果为4294967297对2^32取余,结果为1。

  当无符号数进行减法运算时,实际上是按有符号进行运算,然后类型转换

1 #include<iostream>
2 using namespace std;
3 int main()
4 {
5     unsigned u1=12,u2=10;
6     cout<<u1-u2<<endl;
7     cout<<u2-u1<<endl;
8     return 0;
9 }

  第一个输出毫无疑问为2。

  第二个输出按有符号为-2,转化为unsigned后的值为4294967296-2=4294967294。

时间: 2024-11-08 19:41:53

强制类型转换问题的相关文章

C++强制类型转换操作符 const_cast

const_cast也是一个强制类型转换操作符.<C++ Primer>中是这样描述它的: 1.将转换掉表达式的const性质. 2.只有使用const_cast才能将const性质性质转化掉.试图使用其他三种形式的强制转换都会导致编译时的错误.(添加const还可以用其他转换符,如static_const) 3.除了添加const或删除const特性,使用const_cast符来执行其他任何类型的转换都会引起编译错误.(volatile限定符也包括,不过我不怎么了解,本文主要说const)

C++中的向上类型转换和向下类型转换+四种强制类型转换

转自博客:http://blog.csdn.net/wangweitingaabbcc/article/details/7720979# 在c++的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类,和基类向子类的强制类型转换. 向上强制类型转换 切割:覆盖方法和子类数据丢失的现象生成切割(slice) class Base { public: int b; virtual void Test() { cout << "base" <<en

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynam

java中强制类型转换时,高位数截取成低位数的方法

/** * 强制类型转换中的补码.反码.原码一搞清楚 */ int b=233;//正整数强转 System.out.println((byte)b); //负数:原码的绝对值取反再加一 符号为不变 //00000000 00000000 00000000 11101001 // 1110 1001 补码 // 1110 1000 反码 // 1001 0111 原码 1+2+4+16 =-23 b=-233;//负整数强转 //10000000 00000000 00000000 111010

js类型转换-字符串转整型、浮点型方法、强制类型转换等

1. 转换函数: js 提供了parseInt()和parseFloat()两个转换函数.前者把值转换成整数,后者把值转换成浮点数.只有对String类型调用这些方法, 这两个函数才能正确运行:对其他类型返回的都是NaN(Not a Number).这两个转换函数的结果都是将String数据类型转化为Number. 在 判断字符串是否是数字值前,parseInt()和parseFloat()都会仔细分析该字符串.parseInt()方法首先查看位置0处的 字符,判断它是否是个有效数字:如果不是,

c++的四种强制类型转换

http://hb.qq.com/a/20110722/001452.htm ...... C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性或volatile属性. static_cast,命名上理解是静态类型转换.如int转换成char. 类似于C风格的强制转换.无条件转换,静态类型转换.用于: 1. 基类和子类之

java的自动类型转换和强制类型转换

一.自动类型转换 在 Java 程序中,不同的基本数据类型的数据之间经常需要进行相互转换.例如: , 代码中 int 型变量 score1 可以直接为 double 型变量 score2 完成赋值操作,运行结果为: 82.0  这种转换称为自动类型转换. 当然自动类型转换是需要满足特定的条件的:目标类型大于元类型 二.强制类型转换 当程序中需要将 double 型变量的值赋给一个 int 型变量,该如何实现呢? 显然,这种转换是不会自动进行的!因为 int 型的存储范围比 double 型的小.

C语言中将0到1000的浮点数用强制类型转换的方式生成一幅图像

搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001.然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子. 前几天写了一篇文章是在C语言

C++中4种强制类型转换

不过为了完成强制类型转换,C++中已经为我们提供了4中标准方法,它们是dynamic_cats, static_cast, const_cast, reinterpret_cast,用法形式为:dynamic_cast<类型说明符>(表达式),之所以分成4类,就表示他们各自有着不同的使用环境,下面转载的文章会有详细的说明. const_cast,字面上理解就是去const属性.static_cast,命名上理解是静态类型转换.如int转换成char.dynamic_cast,命名上理解是动态类

今天聊一聊Java引用类型的强制类型转换

实际上基本类型也是存在强制类型转换的,这里简单提一下.概括来讲分为两种: 1.自动类型转换,也叫隐式类型转换,即数据范围小的转换为数据范围大的,此时编译器自动完成类型转换,无需我们写代码 2.强制类型转换,也叫显式类型转换,即数据范围大的转换为数据范围小的,此时数据会损失精度,强转也需要我们书写代码来实现,使用需谨慎 下面我们来看看,引用类型的强制类型转换: 同样分两种:隐式和显式 1.隐式强转,就是父类的引用指向子类的对象,例如 Father类和Child类,我们可以这样写: Father f