最简单的转换为整型提长,对于所有比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;
}