欢迎光临
我们一直在努力

C++学习笔记系列1-6

类型转换——隐式转换

定义:不同类型之间的相互转换,也称作“自动类型转换”,由编译器自行转换。

      低向高转换,如下:

int i = 66665;

short s = 1;

float f = 5.5f;

如果我想让 s 赋值给 i ,即:

i = s ;

那么就是进行了“隐式转换”,并且这个转换是不会出现任何数据丢失的,因为这是由低字节向高字节进行转换,也称“向上转换”。转换成功的原因是:将低字节的short类型变量 赋值给 高字节的int类型变量。这是成功关键。如何知道字节的高低呢?可以使用 “ sizeof()”这个函数,它会传出一个值,值的大小决定字节大小。如本例子中:

cout << sizeof(int) <<endl;

cout << sizeof(short) <<endl;

int是4,short是2,所以int比short字节更大,所以这个隐式转换是完全无误的,由此得出结论,低字节向高字节转换是完全可行的。

但是float的字节同样也是 4,如果想将其赋值给 i,是否能成功呢?这个通过什么判断呢,这就要判断变量类型的精度了。

 

int:存入的是整数,整数是完全精准的,无误差

float:存入的是小数,是有精度误差的

因此:int精度 > float精度

i = f ;

也是可以成功赋值,并且完全无误。

总结:

先看字节大小,小的赋值给大的 => 完全可行;

字节一样,看精度,精度小的赋值给精度大的 => 完全可行。 

 

       高向低转换,

同样是上面的例子,如果将 i 赋值给 s,那么会发生什么?

当 i 的值为66665时,赋值给 s ,即:

s = i;

输出为 :1129

这是因为发生了“数据溢出”,因为 s 是short类型,它是短整型,取值范围在:-32768~32767,而 i 的值是66665,明显已经超出了short的范围,这里有一个万能公式用于验证这个结果,即:

结果值  =   原值 – 65536,将我们的数据代入就是:66665 – 65536 = 1129

所以输出是:1129

由此我们得到结论,将高精度(大字节)向低精度(小字节)进行转换时,会发生数据异常,因此强烈不推荐这样使用。

 

       无符号和有符号之间的转换

int i = -1;

unsigned int ui = i ;

int型 i 赋值给 unsigned int 型 ui,此时输出 ui的值,绝不会是1,而是4294967295,这个数得到的逻辑和上面 int型 赋值给 short型基本一样,但最重要的是两个变量在符号,即:正负数上不一致,这也就回到我们的标题上,即:无符号和有符号之间的转换 => 会出问题。

但是,如果明确知道要赋值的i,它的值始终会在正数区域取值,那么可以这样赋值,但不推荐,毕竟会有隐患。

 

                                                                常用类型字节表

类型 字节数
bool 1
char 1
short 2
int 4
float 4
double 8
long long 8

 

 

赞(0)
未经允许不得转载:171主机测评 » C++学习笔记系列1-6
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址