导航:首页 > 源码编译 > 编译器数据类型转换规则

编译器数据类型转换规则

发布时间:2022-10-01 21:00:29

java中的强制类型转换

在Java中强制类型转换分为基本数据类型和引用数据类型两种,这里我们讨论的后者,也就是引用数据类型的强制类型转换。

在Java中由于继承和向上转型,子类可以非常自然地转换成父类,但是父类转换成子类则需要强制转换。因为子类拥有比父类更多的属性、更强的功能,所以父类转换为子类需要强制。那么,是不是只要是父类转换为子类就会成功呢?其实不然,他们之间的强制类型转换是有条件的。

当我们用一个类型的构造器构造出一个对象时,这个对象的类型就已经确定的,也就说它的本质是不会再发生变化了。在Java中我们可以通过继承、向上转型的关系使用父类类型来引用它,这个时候我们是使用功能较弱的类型引用功能较强的对象,这是可行的。但是将功能较弱的类型强制转功能较强的对象时,就不一定可以行了。

举个例子来说明。比如系统中存在Father、Son两个对象。首先我们先构造一个Son对象,然后用一个Father类型变量引用它:

Father father = new Son();

在这里Son 对象实例被向上转型为father了,但是请注意这个Son对象实例在内存中的本质还是Son类型的,只不过它的能力临时被消弱了而已,如果我们想变强怎么办?将其对象类型还原!

Son son = (Son)father;

这条语句是可行的,其实father引用仍然是Father类型的,只不过是将它的能力加强了,将其加强后转交给son引用了,Son对象实例在son的变量的引用下,恢复真身,可以使用全部功能了。

前面提到父类强制转换成子类并不是总是成功,那么在什么情况下它会失效呢?当引用类型的真实身份是父类本身的类型时,强制类型转换就会产生错误。例如:

Father father = new Father();

Son son = (Son) father;

这个系统会抛出ClassCastException异常信息。

所以编译器在编译时只会检查类型之间是否存在继承关系,有则通过;而在运行时就会检查它的真实类型,是则通过,否则抛出ClassCastException异常。

所以在继承中,子类可以自动转型为父类,但是父类强制转换为子类时只有当引用类型真正的身份为子类时才会强制转换成功,否则失败。

(1)编译器数据类型转换规则扩展阅读:

public class TestCastClassException

{

public static void main(String[] args)

{

Father father = new Son();

//这两句话是不对的,因为一个father类型的引用(指针)是看不见、看不到son中新定义的数据成员或者成员函数的

//虽然这个对象的本质是Son类型的,它也确实有这样的数据成员和成员函数,但是指针的作用范围不够,它看不到。

//代码后面附上模型分析

//father.son = 2;

//father.show_son();

father.show_father();

father.show();

Father father1 = (Father)father;//一个对象在内存中被new出来后,只能选择访问它的方式,不能修改它的布局(包含的成员的个数等)

father1.show();

} //main

}

class Father

{

public int father = 2;

Father(){}

void show()

{

System.out.println("This is father");

}

void show_father()

{

System.out.println("father!!");

}

}

class Son extends Father

{

public int son = 1;

Son(){}

void show()

{

System.out.println("This is son");

}

void show_son()

{

System.out.println("son!!");

}

}

⑵ Java中的强制类型转换是如何转换的

java中数据类型的强制转换是通过强制转换语句完成的,强制转换语句的格式为“目标数据类型 变量 = (目标数据类型) 数据;”。下面给出例子:

1、定义两个字节数据类型a、b、c,分别赋予1和2和a+b的值,进行加法运算的式子a+b=3,得出的结果“3”将会被编译环境判定为整形数据,把这个整形数据赋值给c,系统将会报错,这样就需要用到格式为“目标数据类型 变量 = (目标数据类型) 数据;”的强制转换语句。

2、根据强制转换语句的格式,易得“byte c = (byte)(a+b);”;

3、这样就把整形数据的“3”赋值给字节数据类型的c了,其中完成数据的强制类型转换。

(2)编译器数据类型转换规则扩展阅读:

基本类型 转换原则:

1、类型转换主要在在赋值、方法调用、算术运算三种情况下发生。

a、赋值和方法调用 转换规则:从低位类型到高位类型自动转换;从高位类型到低位类型需要强制类型转换:

(1)布尔型和其它基本数据类型之间不能相互转换;

(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;

b、算术运算 中的类型转换:

1、基本就是先转换为高位数据类型,再参加运算,结果也是最高位的数据类型;

2、byte short char运算会转换为Int;

(1)如操作数之一为double,则另一个操作数先被转化为double,再参与算术运算。

(2)如两操作数均不为double,当操作数之一为float,则另一操作数先被转换为float,再参与运算。

(3)如两操作数均不为double或float,当操作数之一为long,、则另一操作数先被转换为long,再参与算术运算。

(4)如两操作数均不为double、float或long,则两操作数先被转换为int,再参与运算。

特殊:

(1)如采用+=、*=等缩略形式的运算符,系统会自动强制将运算结果转换为目标变量的类型。

(2) 当运算符为自动递增运算符(++)或自动递减运算符(--)时,如果操作数为byte,short或char类型不发生改变;

⑶ C语言中为什么3+3.14表达式结果类型为double

应该是double类型吧

在不同类型的混合运算中,编译器也会自动地转换数据类型,将参与运算的所有数据先转换为同一种类型,然后再进行计算。转换的规则如下:

⑷ 大一C++问题 double类型的变量是否可以赋给整形变量字符型呢数据类型转换的基本原则是什么

楼主你好
数据类型的转换规则为:
(1)从类型高(强调精度高)的转换到类型低(强调精度低)的 这样一般都会得到编译器的警告
因为精度高的变为精度低的数据 会失去数据原本的精度 这样容易丢失数据
例如double a=5.5
int b=a
这里b=5 失去了小数一位.5的精度
数据不精确 但是可以转换

(2)从类型低的转换到类型高的 会正常转换 没有警告

至于字符类型 是完全可以赋值给整型变量的
如果楼主知道 ASCII码
那么字符赋值给整型变量 就是讲字符对应的ASCII码(整型的)赋值给整型变量

(介于楼主是大一 可能才接触c++ 就只讲这么多了哈^_^)

希望能帮助你哈

⑸ C语言强制类型转换

强制类型转换是把变量从一种类型转换为另一种数据类型。

例如,如果您想存储一个 long 类型的值到一个简单的整型中,您需要把 long 类型强制转换为 int 类型。您可以使用强制类型转换运算符来把值显式地从一种类型转换为另一种类型。

(5)编译器数据类型转换规则扩展阅读:

举例说明

使用强制类型转换运算符把一个整数变量除以另一个整数变量,得到一个浮点数:

#include <stdio.h>int main()

{
int sum = 17, count = 5;

double mean;
mean = (double) sum / count;

printf("Value of mean : %f ", mean );
}

当上面的代码被编译和执行时,它会产生下列结果:

Value of mean : 3.400000

⑹ C语言 共用体中的各种类型转换的原则

一、基础知识和数据类型、表达式

1、{},[],(),‘’,“”不配对。解决这个问题最好的方法就是每当写这些符号的时候就先写成一对,然后再在中间加内容。

2、忘记在语句的末尾加分号,或在预处理命令后多加分号。记住:每一个语句的后边都要加分号,而预处理命令并不是语句,所以不加分号,他们必须每行一条,不能把多个命令写在一行。

3、混淆/和\;注释对应的符号是/* */,而转义字符是以\开头,除号是/。

4、printf()和scanf()的参数设置有误,主要表现在以下几方面:

l 类型不匹配的问题。(例如:有float a=3.5,但输出的时候printf(“a=%d”,a);则屏幕上会显示出a=0.00000或者提示其它运行错误)。基本原则是:float对应%f, int对应%d, char对应%c。

l 个数不匹配。无论是哪个函数,都可以有n个参数,第一个永远是“”括起来的内容,表示输出格式。剩下的n-1个是输出的变量或者输入的变量的地址。需要注意的是,如果后边有n-1个参数,那么前边一定对应n-1个%f一类的格式说明符。

l scanf()中变量前忘了加&。记住:scanf()中变量前要有&(但后边学到的字符数组名和指针前不用加)

5、定义标识符的时候经常出现使用非法字符的情况,例如:标识符中不能用空格,也就是说不能有这样的定义:int radium of circle;一般情况下可用下划线将三个单词连接在一起。

6、在使用变量前未定义,或未初始化。例如:若下边的sum未定义,则在编译时会提示相应的错误信息,而若未初始化为0,则求和的结果一定是错误的。

void main()

{ int I,a[10], sum=0; /*只要下边要用,这个定义就必须要有,一般情况下也要有初始值*/

for(I=0;I<10;I++) sum+=a[I];

printf(“%d”,sum);

}

7、计算错误。主要注意:++,――和其它运算符一起运算时,除根据优先级进行计算时,还要考虑先后位置的特殊含义;数据类型不一致时发生的自动转换也会导致计算的误差;还要注意求模结果的符号与被除数相同;某些特殊情况下使用懒惰求值法。

8、不能除以0,要做合法性检查;

9、类型溢出。记住每种数据类型的取值范围,确保数据在所定义类型范围之内;

10、数学表达式的格式有误。常见的有:(1)数学与C语言运算表达式的混淆(例如:=表示赋值,而= =才表示我们数学中的相等关系)。(2)、忽略了运算的优先级。解决这个问题的最好方法就是写数学表达式时不要从左到右,而是按优先级的顺序写,写完优先级高的一个表达式后加上()再写下一级的表达式,例如:计算梯形的面积时,要s=((a+b)*h)/2,不要1/2*a+b*h. (3)忽略了计算和赋值时的自动转换。例如:float half=1/2;这样,因为=右边是整数相除的结果为整数0,不会得到0.5存入half,进而会影响下边的计算结果。要想不在这儿绊跟头,当计算不同类型的数据时,一定注意会不会出现引起错误的自动转换,建议最好加上强制转换。(4)赋值号左边不是变量,例如:若有#define PI 3.14,程序中又出现PI=3.14159。又例如:f(n)=f(n-1)*n(这是典型的数学语言,在C语言中右边的乘积不能正确存储,而左边又是一个函数调用)。

11、使用库函数前忘了加#include<?.h>

二、流程控制

1、 丢掉语句结束标记“;”,尤其是for语句中表达式后或do-while语句后的分号,或在预处理命令后边、while()后、for()后加“;”;

2、 If语句或循环语句中逻辑表达式或关系表达式书写错误。一定要注意C语言的条件与数学表达式的区别(例如我们数学中经常写到的0≤x≤9,在C语言中应该写成x>=0&&x<=9)。

3、 if-else嵌套时不配对。最好在写每个条件时要用两个{}分别将两个分支先括起来,再添加其中的语句,以保证其配对不易错。

4、 switch()语句中的格式不正确。()中的表达式结果一定是一些明确的值,不能是区间;表达式的所有可能结果要列在case后边,case与常量之间有一空格,不要丢掉必要的break;

5、 随意修改循环控制变量i的值,导致循环次数的改变,尤其是当循环有嵌套时。在循环体中,不要将循环控制变量进行另外的改变。

6、 分不清什么情况下用双重循环,什么情况下用两个控制变量写成一重循环。当I不变,j又循环一遍的时候用双重循环。当I,j同时变化的时候用一重循环,此时,循环控制变量有两个,但条件只写一个就可以,因为另一个总是进行相应的变化的。

7、 忽略循环体与循环控制变量的关系。其实,很多情况下,循环控制变量都在循环体中起到非常重要的作用。应该利用上这种关系。

三、数组与指针

1、 字符串的输入有错误:主要表现在使用scanf()或gets()时加了&,或输入字符串时用循环,(这样的话,字符个数无论多长,都不会为自动加\0,将来引用的时候也就不能以字符串的形式引用。)

2、 对字符串的处理中,循环条件仍然写成I<N。由于字符串是不定长的,所以循环条件一般为str[I]!=’\0’ 或I<strlen(str)

3、 而输入所对应的变量是指针时(常见的有:输入的变量是字符数组名或指向字符串的指针)不能加&。

4、 指针定义后未赋值就引用。如果在定义时不知道赋什么值,可以用p=NULL赋初值,以避免引起的灾难性错误。

5、 分不清p和*p。前者是指针,即地址,后者表示指针所间接引用的数据,但如果是二级指针或多级指针,取*以后得到的仍然可能是地址。

四、函数

1、 函数定义的时候,函数头部加分号,而函数声明的地方忘了加分号

2、 函数实参格式不对,主要表现在:给出实参时,多给出数组类型,或者,形参是数组int a[];的时候,给出的a[]或a[I].

3、 递归时忘了设置边界条件,这样易造成死循环调用。

4、使用函数之前未声明(包括C库函数的声明)。建议大家,将所定义的一切函数都在程序开始的预处理命令后加上函数原型的声明,这样做不仅可以避免错误,而且整个程序的结构看起来更清楚。

五、结构体共用体

1、 结构体类型定义有误,主要表现在:结构体类型里还有嵌套的时候,忘记了成员名称。(例如:下边的例子中,有些同学经常忽略了birthday)

2、 结构体类型名和结构体变量名混淆。例如:

struct STU

{….

Struct data

{int year,month,day;<br _extended="true"><br _extended="true">}birthday

};

struct STU a; struct STU是类型名称,而且不分配空间,且不能直接引用。只有定义了结构体类型struct STU的变量a以后,才为a分配相应的内存空间,引用时也要是a.???

3、 结构体变量的成员引用不正确,尤其是当结构体类型中有嵌套定义的时候。一定要一级一级的引用。例如:上边的例子:如果引用其中的年的话,一定是a.birthday.year.不能直接a.year.

4、 对结构体变量进行输入输出的时候,整体输入或整体输出。除作为函数参数外,不能对结构体变量整体操作,只能一个成员一个成员地输入、输出。

5、 不理解共用体的“共占内存”。对共用体中的成员变量,一定要靠一个标记区别它们,并分别按不同类型引用它们。切记:共用体变量不能做函数形参。

六、文件

1、 使用之前没有打开文件,使用之后没有关闭文件。

2、 相关函数的调用格式有误。请一定注意实参的类型、顺序、个数上与函数原型(或函数声明)的一致

⑺ 何谓隐式类型转换其转换规则如何

数值的类型转换分为强制性转换(我们人为的转换)和自动转换(也就是隐式转换,编译器自己进行的转换,不经我们的同意)
要想知道什么是隐式转换,那你首先得清楚数值共可以分为几个类型,其中包括char=short<int<unsingned<long=float<double.他们的精确度是随之增加的,他们能表示数值的范围也是越来越大的。如果同类型的数值相操作(加减乘除等),是不会发生类型转换,如果是不同类型数值相操作,比如说short型数值和int型数值相操作,那么小取值范围的类型(short)会先隐式转换为取值范围大的类型(int),然后再进行数值间的操作,得出来的结果也是int型。
我说道这里不知道你能否看懂。建议你看看谭浩强的《c程序设计》,里面讲的比较详细。

⑻ C语言 数值类型隐式转换的规则。帮忙看一下我理解的对吗。

这个问题问题的好,是一个复杂的问题,只能简单的按你的理解一起讨论一下。有不同观点
可以来 0x30网络贴吧直接发贴共同交流,网络知道不常在,可能会不能及时收到追问提示。

1、整数转整数时, 将优先存放数据位的低位, 溢出的则抛弃. //未必
原因:有两种情况小字节的整数转大字节的整数,要看小字节是有符号数还是无符号数。比如下面的代码:
unsigned char ux = 0x80;
char x = 128;
int i = ux; //此时x为无符号的char,所以i的值为128
i = x; //此时x为有符号char,所以i的值为 -128
本质是有符号使用符号扩展,无符号使用0扩展。
大字节的整数转小字节的整数,要看cpu的存储顺序。你说的只是intel平台上的,它是小端机,比如:
int i = 0x12345678;
char x = i;//在little endian的机器上,它的值是0x78如你所说,但是在big endian的机器上它将是0x12。

2、浮点转整数时, 将优先存放数据位的高位(小数点之前的位), 小数点后丢弃.//可以设置丢弃方式
原因:浮点数转整型数时,C/C++都是直接舍弃掉小数部分。比如
int i;
for (double f=1.0; (2.0 -f) >=FLT_EPSILON ; f+=0.1) {
i = f;
printf("%d\n", i); //不管你是1.0 还是1.9转成整数都是1
}
但是这种舍弃规则是可以修改的,方法就是调用math.h中声明的的floor()或者ceil(),前者是下行整型化,后者是上行整型化,换句话说,比如1.5floor(1.5) 它的值就是1
(下行整型化),ceil(1.5)就是2.0,这是上行整行化。
3、浮点转浮点时, 将优先存放数据位的高位, 溢出的则抛弃.’(高精度转低精度时将会进行四舍五入)

高精度转低精度,C/C++标准未进行说明,有实现决定,vc++中是四舍五入。这种转换,实际上没有任何意义,因为数据丢失了。
低精度转高精度,这个直接提升就好了。
4、整数转浮点时, 将优先存放数据的低位, 溢出的则抛弃.
这个C/C++标准中也未进行说明,有实现决定。

⑼ 在 c语言中int long unsigned 和 char这四种类型数据的转换规律是什么

首先,在C中,数据之间的运算必须是同类型的才能进行运算。如果类型不一致,就必须先转换成相同的类型----------由低级别 → 高级别转换。

本题中,数据类型级别由低到高分别为:char→int→unsigned→long。转换时由低级别向高级别转换。

比如,有两个数的数据类型分别为:char型跟long型。 就要先char转换为long型(因为long级别比char高),再进行运算。

但是不能理解为:先将char转换成int,再转换成unsigned,再转换成long。

⑽ c语言中,数据类型转换前与转换后数据的区别

数据类型转换的一般格式为:(type_name)
expression
type_name为要转换到的数据类型,expression为表达式。例如:
(float)
a;
//把a转换为实型
(int)(x+y);
//把x+y的结果转换为整型
(float)
100;
//将一个常量转换为实型
【示例】将整数转换为浮点数:
#include
<stdio.h>
int
main()
{

int
sum
=
17,
count
=
5;

double
mean;

mean
=
(double)
sum
/
count;

printf("Value
of
mean
:
%f\n",
mean);

return
0;
}
运行结果:
Value
of
mean
:
3.400000
需要注意的是,类型转换运算符(
)的优先级高于/,(double)
sum
/
count会先将
sum
转换为
double
类型,然后再进行除法运算。如果写作(double)
(sum
/
count),那么运行结果就是
3.000000。
这种由程序员显式进行的转换称为强制类型转换。除了强制类型转换,在不同数据类型的混合运算中编译器也会隐式地进行数据类型转换,称为自动类型转换。
自动类型转换遵循下面的规则:
若参与运算的数据类型不同,则先转换成同一类型,然后进行运算。
转换按数据长度增加的方向进行,以保证精度不降低。例如int型和long型运算时,先把int量转成long型后再进行运算。
所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。
char型和short型参与运算时,必须先转换成int型。
在赋值运算中,赋值号两边的数据类型不同时,需要把右边表达式的类型将转换为左边变量的类型。如果右边表达式的数据类型长度比左边长时,将丢失一部分数据,这样会降低精度。

阅读全文

与编译器数据类型转换规则相关的资料

热点内容
云服务器20性能 浏览:986
android强制系统横屏 浏览:280
怎么提前看未播出的电视剧app 浏览:666
cad转pdf图层 浏览:600
程序员接私活初级 浏览:433
全无油润滑压缩机 浏览:185
代码加密常用方法 浏览:953
安卓手机如何解除已禁用 浏览:396
算法的随机性 浏览:486
高中解压体育游戏 浏览:533
androidstudior丢失 浏览:345
命令行笔记 浏览:738
360目标文件夹访问拒绝 浏览:519
3b编程加工指令 浏览:790
c8051f系列单片机选型手册 浏览:773
南昌php程序员 浏览:513
bcs命令 浏览:447
如何在服务器指向域名 浏览:417
车床编程可以做刀吗 浏览:519
ln命令源码 浏览:793