自动类型转换_自动类型转换规则 - CSDN
精华内容
参与话题
  • /* 自动类型转换规则如下: */ /* 1、参与运算的类型不同,则先转换为同一类型 */ /* 2、两种类型字节数不同,转换为高字节数的类型 */ /* 3、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型...
    #include <stdio.h>
    
    int main()
    {
    	/* 自动类型转换规则如下: */
    	/* 1、参与运算的类型不同,则先转换为同一类型 */
    	/* 2、两种类型字节数不同,转换为高字节数的类型 */
    	/* 3、转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。 */
    	/* 4、若两种类型的字节数相同,且一种有符号,一种无符号,则转换成无符号类型 */
    	/* 5、所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。 */
    	/* 6、char型和short型参与运算时,必须先转换成int型 */
    	unsigned char a = 6;
    	int b = -20;/* unsigned char a --> int a */
    	a+b>0?puts("a+b>0"):puts("a+b<0");
    	printf("%x\r\n", a+b);
    	
    	char c = -20;
    	unsigned int d = 6;/* char c --> unsigned int c */
    	c+d>0?puts("c+d>0"):puts("c+d<0");	
    	printf("%x\r\n", c+d);	
    	
       	return 0;
    }
    
    展开全文
  • JAVA中的类型自动转换机制

    千次阅读 2018-07-06 14:02:45
    1、概述自动类型转换也叫隐式类型转换表达式的数据类型自动提升所有的byte型、short型和char的值将被提升到int型。如果一个操作数是long型,计算结果就是long型;如果一个操作数是float型,计算结果就是float型;...

    1、概述

    • 自动类型转换也叫隐式类型转换

    • 表达式的数据类型自动提升

      • 所有的byte型、short型和char的值将被提升到int型。

      • 如果一个操作数是long型,计算结果就是long型;

      • 如果一个操作数是float型,计算结果就是float型;

      • 如果一个操作数是double型,计算结果就是double型。

    2、数据类型只会自动提升,不能自动降低

    • int值可以赋值给long、float、double型变量,不能赋值给byte、short、char型变量


    • 对于函数的传参也是一样


    • 当然,在有函数重载的情况下,java编译器会自动选择最匹配的函数进行调用


    3、Java中整数默认的数据类型是int类型

    • 所有长度低于int的类型(byte、short、char)在运算之后结果将会被提升为int型


    • 当然还有以下的这种情况,这种情况是因为我们在进行赋值运算的时候,java编译器可以明确知道运算的结果是否超过byte或short的取值范围,所以 byte a = 1 + 1; 并没有报错。而上面 byte c = a + b; 编译出错的原因是因为a和b均为一个变量,相加的结果是否会超过byte的取值范围编译器并不知道,所以编译器将结果提升为int型了。


    4、结论

    • 当编译器明确知道整数的运算结果没有到达int的表示范围时,byte、short或char类型的运算结果不会被自动提升为int类型

    • 当编译器明确知道或不清楚整数的运算结果是否到达int的表示范围时,编译器将会自动将运算的结果转换成int,即使原来是byte、short或char类型。

    展开全文
  • 自动类型转换

    千次阅读 2019-02-01 19:51:57
    (一)自动类型转换  在java 程序中,不同的基本类型的值经常需要进行相互类型转换,类型转换分为自动类型转换和强制类型转换。布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本...

    (一)自动类型转换

         在java 程序中,不同的基本类型的值经常需要进行相互类型转换,类型转换分为自动类型转换和强制类型转换。布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型与其他基本类型不能进行类型的转换(既不能进行自动类型的提升,也不能强制类型转换), 否则,将编译出错。

        java的所有数值型变量可以进行相互转换,如果系统支持把某种基本类型的值直接赋值给另一种基本类型的变量,则这种方式成为自动类型转换。

         当把一个表数范围较小的数值或变量直接赋给另外一个表数范围比较大的变量时,系统将可以自动类型转换,否则需要强制转换。

        图中箭头左边的数值可以自动转换为右边的数值。

           (2)byte型可以转换为short、int、、long、float和double; 
      (3)short可转换为int、long、float和double; 
      (4)char可转换为int、long、float和double; 
      (5)int可转换为long、float和double; 
      (6)long可转换为float和double; 
      (7)float可转换为double; 

     

    (二)基本类型转换为字符串

    不仅如此,把任何基本类型的值和字符串进行连接运算时,基本类型的值将自动转换成为字符串类型,虽然字符串类型不是基本类型,而是引用类型。因此,如果想将基本类型的值转换为对应的字符串,可以把基本类型的值和一个空字符串进行连接。

     

       (三)强制类型转换

         强制类型转换,即强制显示的把一个数据类型转换为另外一种数据类型。

        如果希望图中箭头右边的类型转换为左边的类型,则必须进行强制类型转换,强制类型转换的格式:

      (targetValuevalue

        强制类型转换的运算符是圆括号,当进行强制类型转换的时候,类似把一个大瓶里的水倒入一个小瓶子,如果大瓶子里的水不多还好,如果大瓶子了的水很多,将会引起溢出,从而造成数据丢失这种转换也被称为缩小转换。

    (四)表达式的自动提升

       当一个算数表达式中包含多个基本类型的值的时候 ,整个算数表达式的数据类型将发生自动提升。java定义了如下的自动提升规则:     1 所有的byte类型,short类型和char类型将被提升到int类型。     2 整个算数表达式的数据类型自动提升到与表达式中最高等级操作数同样的类

    (五)总结

    1    java中整数类型默认是int类型,小数类型默认是double类型。

    2    char可以当做一种特殊的整数类型

    3    int无法转换为boolean

    4    小数类型转为整数类型,小数可能被舍弃,出现精度损失,所以需要强制转换。

    5    boolean 类型不能转换为其它数据类型。

     

     

    展开全文
  • 1、隐式转换 C在以下四种情况下会进行隐式转换: ... 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。  3、函数调用中参数传递时,系统隐式地将实参转换为形参的...

    转自:https://blog.csdn.net/cherish_2012/article/details/21243047

    1、隐式转换
        C在以下四种情况下会进行隐式转换:
           1、算术运算式中,低类型能够转换为高类型。
           2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。
           3、函数调用中参数传递时,系统隐式地将实参转换为形参的类型后,赋给形参。
           4、函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。

    2、算数运算的隐式转换
        算数运算中,首先有如下类型转换规则:
           1、字符必须先转换为整数(C语言规定字符类型数据和整型数据之间可以通用) 。
           2、short型转换为int型(同属于整型) 。
           3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度(同属于实型) 。
        其次,有下面的规则。

        当不同类型的数据进行操作时,应当首先将其转换成相同的数据类型,然后进行操作,转换规则是由低级向高级转换。转换规则如下图所示:

     

    有符号数与无符号数之间运算问题
    以下实验均在virual c++6中运行通过
    这个问题测试是否懂得C语言中的整数自动转换原则,有些开发者懂得极少这些东西。当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。 
    首先进行一个实验,分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较:
        unsigned int a=20;
        signed int b=-130;
    a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?
    这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,因此a=20,b=4294967166,这样比较下去当然b>a了。
    再举一个例子:
     unsigned int a=20;
     signed int b=-130;
     std::cout<<a+b<<std::endl;
    结果输出为4294967186,同样的道理,在运算之前,a=20,b被转化为4294967166,所以a+b=4294967186

    减法和乘法的运算结果类似。

    如果作为signed int型数据的b=-130,b与立即数之间操作时不影响b的类型,运算结果仍然为signed int型:
    signed int b=-130;
    std::cout<<b+30<<std::endl;
    输出为-100。

    而对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。

    #include <iostream>  
    /* 
    当表达式中存在符号类型和无符号类型时 
    所有的操作数都自动转换为无符号类型 
    */  
    using namespace std;  
    char getChar(int x,int y){  
        char c;  
        unsigned int a=x;  
        unsigned int b=a+y;  
        (a+y>10)?(c=1):(c=2);  
        return c;  
    }  
    void main(){  
    char c1=getChar(7,4);  
    char c2=getChar(7,3);  
    char c3=getChar(7,-7);  
    char c4=getChar(7,-8);  
      
    printf("c1=%d\n",c1);  
    printf("c2=%d\n",c2);  
    printf("c3=%d\n",c3);  
    printf("c4=%d\n",c4);  
    system("pause");  
    }


    答案: c1 = 1  c2=  2  c3= 2  c4= 1

     

       

     

    这样一个题,据说是微软面试题:

    unsigned int i=3;
    cout<<i * -1;

    问结果是多少。

     

     

     

    第一反应:-3。不过结果似乎不是这样的,写了个程序,运行了一下,发现是:4294967293。很诡异的一个数字,怎么也想不明白为什么会是这么个奇怪的数字。但是在我发现这数的十六进制数是FFFFFFFD时,我想我已经离答案很近了...

     

    这个涉及到了混合着不同数据类型的表达式中的数据类型的转换问题。在总结转换问题之前,先说明一下各种数据类型(只说明numeric类型的),下表来自MSDN:

     

     

    对上表补充说明一下:

    1)在32位机上,int型和unsigned int型都是32位的(4个字节)。

    2)enum会跟据最大值来决定类型,一般来说为int型,如果超出int型所能表示的范围,则用比int型大的最小类型来表示(unsigned int, long 或者unsigned long)

    3)关于类型的大小。一般用所能表示的数据范围来比较类型的大小,如char型<unsigned char型<short型...在表达式中,一般都是由小的类型向大的类型转换(强制类型转换除外)

     

    下面结合自己查的资料,加上自己不断地举各种情况编程,总结一下关于类型转换(仅限于算术表达式中关于整数类型的转换)的一些问题(如有缺漏,欢迎补充,感激不尽)

    1、所有比int型小的数据类型(包括char,signed char,unsigned char,short,signed short,unsigned short)转换为int型。如果转换后的数据会超出int型所能表示的范围的话,则转换为unsigned int型;

    2、bool型转化为int型时,false转化为0,true转换为1;反过来所有的整数类型转化为bool时,0转化为false,其它非零值都转为true;

    3、如果表达式中混有unsigned short和int型时,如果int型数据可以表示所有的unsigned short型的话,则将unsigned short类型的数据转换为int型,否则,unsigned short类型及int型都转换为unsigned int类型。举个例子,在32位机上,int是32位,范围–2,147,483,648 to 2,147,483,647,unsigned short是16位,范围0 to 65,535,这样int型的足够表示unsigned short类型的数据,因此在混有这两者的运算中,unsigned short类型数据被转换为int型;

    4、unsigned int 与long类型的转换规律同3,在32位机上,unsigned int是32位,范围0 to 4,294,967,295,long是32位,范围–2,147,483,648 to 2,147,483,647,可见long类型不够表示所有的unsigned int型,因此在混有unsigned int及long的表达式中,两者都被转换为unsigned long;

    5、如果表达式中既有int 又有unsigned int,则所有的int数据都被转化为unsigned int类型。

     

    经过这番总结,前面提出的问题的答案应该就很明显了吧。在表达式i*-1中,i是unsigned int型,-1是int型(常量整数的类型同enum),按第5条可以知道-1必须转换为unsigned int型,即0xffffffff,十进制的4294967295,然后再与i相乘,即4294967295*3,如果不考虑溢出的话,结果是12884901885,十六进制0x2FFFFFFFD,由于unsigned int只能表示32位,因此结果是0xfffffffd,即4294967293。

     

    http://blog.csdn.net/miaouu/article/details/5213042

    http://blog.csdn.net/ysuncn/article/details/1787189

     

    展开全文
  • C++自动类型转换

    2017-11-30 21:35:40
    在C++中,如果编译器看到一个表达式或函数调用使用了一个不合适的类型,它会执行一个自动类型转换,将不合适的类型转换为合适的类型。对于自定义类,可以通过定义该类的构造函数的方法将其它类型转换为本自定义类;...
  • 所以笔者决心写一篇详解,说明数据类型转换时内存中究竟发生了什么,又为何会出现类型转换后与预期不符的情况。 由于文章内容大部分都是笔者自己的理解,或是查阅资料和博客后的总结,多多少少会有错误,请各位...
  • 自动类型转换规则: 强制类型转换: 代码示例: package com.jredu.ch02; public class Ch04 { public static void main(String[]args){ //自动类型转换 //基本数据的自动类型转换只有7种...
  • 自动转换是程序在执行过程中“悄然”进行的转换,不需要用户提前声明,一般是从位数低的类型向位数高的类型转换;强制类型转换则必须在代码中声明,转换顺序不受限制。 自动数据类型转换 自动转换按从低到高的顺序...
  • java基本数据类型转换

    万次阅读 2020-07-03 10:39:12
    java基本数据类型的转换自动类型转换强制类型转换 自动类型转换 举例:多种不同的数据类型的一起运算 解释:有多种类型的数据混合运算时,系统首先自动将所有数据转换成容量最大的那个数据类型,然后再进行计算。 ...
  • 目录 目录 类型判断 ...自动类型转换 目录导航 类型判断 typeof JS 中可以使用关键字 typeof 判断 demo typeof "hello" typeof true typeof 1 typeof 1.23 typeof [1,2,...
  • Java 类型转换

    万次阅读 2019-05-17 08:11:26
    一、自动类型转换(隐式类型转换) 整型、实型(常量)、字符型数据可以混合运算。不同类型的数据先转化为同类型再进行运算 自动转换按从低级到高级顺序: char ↓ Byte→short→int→long---›float→double ...
  • 数据类型转换 概述 强制转换 Number String 原始类型值 对象 Boolean 自动转换 自动转换为布尔值 自动转换为字符串 自动转换为数值 原文地址 目录导航 数据类型转换 概述 JavaScript 是一种...
  • C语言中数据类型的自动类型转换

    千次阅读 多人点赞 2017-06-17 10:00:45
    非常的重要的声明: 这篇博客的内容,主要参考网友的博客。 尊重知识产权,尊重原创!一、 C在以下四种情况下会进行...函数有返回值时,系统将隐式地将返回表达式类型转换为返回值类型,赋值给调用函数。 二、 运算表
  • 使用mybatis的generator自动生成代码,但是oracle数据库中number(6,2)总是自动转成BigDecimal,我想要转成的是float类型 这样就写了一个类型转换器,需要继承JavaTypeResolver接口 然后在mybaties配置文件...
  • C++:类的自动转换和强制类型转换

    千次阅读 2016-09-06 13:05:05
    自动类型转换的流程 使用explicit关键字关闭隐式类型转换 自动参数匹配与二义性 转换函数 定义转换函数 自动应用类型转换与二义性 避免使用隐式类型转换 C++如何处理内置类型转换C++为内置的基本数据类型提供了自动...
  • C语言中的整数自动转换原则

    万次阅读 2011-09-07 21:28:27
    1、隐式转换  C在以下四种情况下会进行隐式转换:  1、算术运算式中,低... 2、赋值表达式中,右边表达式的值自动隐式转换为左边变量的类型,并赋值给他。  3、函数调用中参数传递时,系统隐式地将实参转换为形参
  • 今天测试分区索引,发现oracle智能化的一方面:若列为number类型,用其作为where条件时,变量为varchar2类型时会自动将变量转换为number类型,而不是将列转换为number类型。 例如,表testn存在number类型的列a,...
  • byte、short、char和int的转换

    千次阅读 2016-10-22 15:26:55
    从低级类型到高级类型的转换为自动类型转换,把高级数据类转赋值给低级数据类需要强制类型转换 (低)byte、short、char->int->long->float->double(高) 其中byte类型数据可以自动转换成short类型。 short类型数据...
  • Java学习-类型转换(Casting)

    千次阅读 2020-08-13 15:27:19
    自动类型转换:小的数据类型可以自动转换成大的数据类型(如 long g = 20 ; double d = 12.0f) 强制类型转换:可以把大的数据类型强制转换成小的数据类型(如 float f = (float)12.0 ; int a = (int)1200L) ...
  • 1.问题背景  在问题类型转换中,short a = 1;把int类型转为short类型推翻了转换类型中的,大转小的理论,其实不然。与float f = 3.4 中double float转为...基本类型间的自动类型转换需要满足以下条件: (1).转换双
1 2 3 4 5 ... 20
收藏数 889,935
精华内容 355,974
关键字:

自动类型转换