C++中,混合数值类型

版权声明:本文为博主原创文章,欢迎大家转载! https://blog.csdn.net/Chamico/article/details/79491380

       当你在同一个表达式中组合不同的数据类型时,C++会遵循特定的规则,编译器尽可能地允许混合不同的类型,当有可能数据丢失时会发出警告,并尝试做出最合适的事情。

       接下来为大家介绍几种最常见的几种混合数据的情况:整数与浮点数,布尔型与整型,有符号整型和无符号整型。


1、整数与浮点数:

         在C++中,无论是否有实际的小数点部分,一个带有小数点的数字都以浮点性储存,没有小数点的数字就是整型。在混合表达式中,一个范围较小的数据会被自动提升为范围较大的数据。

           

double x = 0;

在此情况下,0最开始存储在整型中,由于它被赋值到 x(浮点数),所以在赋值之前,整数0被自动提升到double类型

       但是反方向的赋值是有问题的,编译器会提示警告。

int i = 2.0;

把一个数值转换为小范围的类型,会导致编译器发出有关数据可能丢失的警告。

        在这些情况下,为了避免产生警告信息,可使用  static_cast  运算符,比如

int i = static_cast<int>(2.0);


2、布尔与整型:

        首先介绍一下在C语言中,判断一个表达式是否为真,可以通过表达式最终的值去判断,如果表达式的值为 0 ,则在条件判断中此表达式为假;若表达式的值为非0的值,则在条件判断中此表达式的值为真。

        C++在继承此基础上引入了新的类型:布尔型,true 表示真, false 为假。所以在布尔型与整型相互转换的过程中,整型非0 -> true,0 -> false。 false -> 0;  true -> 1.


3、有符号整数和无符号整数

      在任何类型的算数表达式中使用宽度比int 类型的宽度小的时,它的宽度会被提升(例外:char  类型变量相互赋值时)。

     如果某种类型的数字位数比别的数字类型小,那么较小的数字类型会被提升到较大的类型大小。因此,short 被提升为 long。

      如果两个操作符具有相同的宽度,但一个时有符号的而另一个时无符号的,那么,有符号的操作数被提升为无符号的操作数。

#include<iostream>
using std::cout;
using std::endl;
int num1;
int main()
{
   unsigned num1 = -1;
   int num2 = -2;
   cout <<"num1: "<<num1<<endl;
   cout <<"num2: "<<num2<<endl;
   cout <<"num1 + num2: "<<num1 + num2<<endl;
   cout <<"num1 * num2: "<<num1 * num2<<endl;
}

       运行结果:

               

      从最后的结果来看这两个数字都被视为有符号数字,因为 (-1 )* (-2 )= 2,然而这里真正发生的是 num1 * num2 发生了溢出。

猜你喜欢

转载自blog.csdn.net/Chamico/article/details/79491380