C++算术运中算术转换和溢出!

C++算术运中算术转换和溢出!

最简单的转换为整型提长,对于所有比int小的整型,char,signed char,unsigned char,short,unsigned short 如果该类型的所有可能的值都能包容在int内,它们就会被提长为int,否则它们将被提长为unsigned int.如果将bool提升为int,则false为0,true转换成1.

 1.有符号与无符号类型之间的转换若表达式中使用了无符号数值,所定义的转换规则需要保护操作的数精度。unsigned操作数的转换依赖于机器中整型的相对大小,因此这种转换本质上依赖于机器。包含short和int类型的表达式,short转换成int,如果int型有足够的空间表示所有的unsigned short, 则将unsigned short转换为int,否则将两个操作数均转换成unsigned int。例如,如果short用半个字表示而int用一个字表示,则unsigned值都能包容在int内,在这种机器上,unsigned转换为int. 也就是说在32位的机器上short,unsigned int都转换成int.

2.long和unsigned int转换也一样,只要机器上的long型有中够的空间表示unsigned int类型所有的值,就将unsigned int转换为long,否则,将两个操作数均转换为unsigned long. 在32位机器上,long和int型通常用一个字长表示,因此当表达式包含unsigned int和long类型时,其操作数应转换为unsigned long.

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

 {  

 unsigned int x=32767;  

long y=-32768;  

  /*   c=-1   d=4294967295  

 */  

 long c=x+y;  

 unsigned long d=x+y;  

cout<<"c="<<c<<endl;  

cout<<"d="<<d<<endl;

  return 0; }

3.对于包含signed和unsigned int 型的表达式,表达式中的signed型会转换为unsigned型,可能产生溢出。

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

{  

unsigned int x=32767;  

 int y=-32768;

  /* c=-1   d=4294967295   */

  int c=x+y;  

 unsigned int d=x+y;  

cout<<"c="<<c<<endl;  

 cout<<"d="<<d<<endl;   return 0; }

4.对于包含signed和unsigned char型的表达式,表达式中的signed型会转换为unsigned弄的,运算结果也可能会出现溢出

using namespace std;

int main(int argc, char *argv[])

 {  

 unsigned char x=200;

 char y=-1;  

 /*  

 在时行运算时将y转换为unsigned类型为:

 255   此值与x相加,相加后为455,再进行计算,结果199,  

  如果这个值赋给unsigned没有问题,

 但是如果赋给   signed char就溢出了,

 用256-199=57,再加个负号.   运行结果如下:

  c=-57   d=199

  */  

char c=x+y;  

unsigned d=x+y;  

cout<<"c="<<(int)c<<endl;

cout<<"d="<<(int)d<<endl;   return 0; }

5.关于溢出的计算:

#include <iostream>

using namespace std;

int main(int argc, char *argv[])

 {  

/*  

*计算方法用725%256,如果取得数大于等于128,就用  

*256-128得得数值前加负号,否则为正数。  

*例如:725%265=213 256-213=43,-43   

*用-80%256=176

*/

char a=725;  

 unsigned char b=-80;

cout<<"a="<<(int)a<<endl;  

cout<<"b="<<(int)b<<endl;   return 0;

}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值