强制转换

2020-01-05

江枫思渺然 提交于 2020-01-06 18:26:34
C语言数据类型的自动转换和强制转换有什么区别 一、指代不同 1、自动转换:参与运算量的类型不同,则先转换成同一类型,然后进行运算。 2、强制转换:是通过类型转换运算来实现的。 二、方式不同 1、自动转换:转换按数据长度增加的方向进行,以保证精度不降低。如int型和long型运算时,先把int量转成long型后再进行运算。 2、强制转换:功能是把表达式的运算结果强制转换成类型说明符所表示的类型。 三、特点不同 1、自动转换:是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。 2、强制转换:所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算。 参考资料来源:百度百科-C语言类型强制转换参考资料来源:百度百科-自动类型转换 https://zhidao.baidu.com/question/601431282/answer/3099799927.html?fr=index_ans 来源: CSDN 作者: xzy13013 链接: https://blog.csdn.net/xzy13013/article/details/103847273

C语言类型强制转换

五迷三道 提交于 2020-01-04 05:43:26
C语言类型强制转换 强制类型转换 是通过类型转换运算来实现的。其一般形式为: (类型说明符) ( 表达式 ) 其功能是把表达式的运算结果 强制转换 成类型说明符所表示的类型。 目录 1 基本介绍 2 注意事项 1 基本介绍 编辑 强制类型转换 是通过类型转换运算来实现的。其一般形式为:(类型说明符)( 表达式 )其功能是把表达式的运算结果 强制转换 成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。例如: (float) a 把a转换为实型,(int)(x+y) 把x+y的结果转换为 整型 。在使用 强制转换 时应注意以下问题: 2 注意事项 编辑 1.类型说明符和 表达式 都必须加括号(单个 变量 可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。 2.无论是 强制转换 或是自动转换,都只是为了本次运算的需要而对 变量 的数据长度进行的临时性转换,而不改变数据说明时对该 变量 定义的类型。 例1: main() { float f=5.75; printf("f=%d,f=%f\n",(int)f,f); } f=5,f=5.750000 将float f 强制转换 成int f float f=5.75;printf("(int)f=%d,f=%f\n",(int)f

C语言指针类型 强制转换

99封情书 提交于 2020-01-04 05:38:08
关于C语言指针类型 强制转换 引用一篇文章: C语言中,任何一个变量都必须占有一个地址,而这个地址空间内的0-1代码就是这个变量的值。不同的数据类型占有的空间大小不一,但是他们都必须有个地址,而这个地址就是硬件访问的依据,而名字只是提供给程序员的一种记住这个地址的方便一点的方法。但是,不同的变量在机器中都是0-1代码,所以,我们不能简单的通过检查一个值的位来判断它的类型。 例如,定义如下: int a; float b; double c; long double d; (假设它们所占的字节分别是 4、 8、 8、 10,而且连续存储于某个地址空间,起始地址是 100,则我们可以得到如下内存分布 ) a变量就是由以地址100开始到103结束的4个字节内存空间内的0-1代码组成。b变量则是由以地址104开始到112结束的8个字节内存空间内的0-1代码组成。而在机器中,这些内存都是连续的0-1代码,机器并不知道100~103是整型而104~111是float型,所有这些类型都是编译器告知的。当我们用a时,由于前面把a定义为int型,则编译器知道从a的地址开始向后取4个字节再把它解释成int型。那么(float)a,就是先按照int类型取出该数值,再将该数值按照int to float的规则转换成float型。所以强制类型转换就是按照某个变量的类型取出该变量的值,再按照***to**

Java 数据类型总结

本小妞迷上赌 提交于 2019-12-23 11:59:01
Java 中提供了八种数据类型:6个数字类型(四个整数型,两个浮点型)、字符类型、布尔型。 依次分别是 : byte、int、short、long、float、double、char、boolean。 byte类型数据占1个字节,8位,最高位表示符号,则表示范围是:-2^7~2^7-1 int类型数据占4个字节,共32位,最高位表示符号,则表示范围是:-2^31~2^31-1 short类型数据占2个字节,共16位,最高位表示符号,则表示范围是:-2^15~2^15-1 long类型数据占8个字节,共64位,最高位表示符号,则范围是:-2^63~2^63-1 float数据类型占4个字节,共32位,范围是:10^-38~10^38和-10^38~-10^-38 double数据类型占8个字节,共64位,范围是:10^-308~10^308和-10^308~-10^-308 char数据类型占2个字节,但最高位不用来表示符号。用它能表示 Unicode 集里的 0~2^16-1(0~65535) 位置的字符 char数据类型应用有以下方式: 如:char a='A'; char a=97(不能用short类型,因为最高位表示符号,故表示数值的只有15位); 具体的可以参考下图: ​ 2、数据类型转换时出现的问题 2.1、自动转换 一个 int 类型变量和一个 byte

第11课 - 新型的类型转换

大城市里の小女人 提交于 2019-12-23 02:38:10
一、C方式的强制类型转换 C语言的强制类型转换的代码如图1所示: 图1 C语言方式强制类型转换存在的问题 过于粗暴;任意类型之间都可以进行转换,编译器很难判断其正确性。 难于定位;在源代码中无法快速定位所有使用强制类型转换的语句。 二、C++的新式类型转换 C++将强制类型转换分为4种不同的类型。如下图所示; 图2 4种强制类型转换的详细介绍如下: (1)static_cast强制类型转换:用于基本类型间的转换;不能用于基本类型指针间的转换;用于有继承关系类对象之间的转换和类指针之间的转换。 (2)cosnt_cast强制类型转换:用于去除变量的只读属性;强制转换的目标类型必须是指针或引用。 (3)reinterpret_cast强制类型转换:用于指针类型间的强制转换;用于整数和指针类型间的强制转换。 (4)dynamic_cast强制类型转换:用于有继承类型的类指针间的转换;用于有交叉关系的类指针间的转换;具有类型检查的功能;需要虚函数的支持。 三、小结 C方式的强制类型转换 过于粗暴; 潜在的问题不易被发现 不易在代码中定位 新式类型转换以C++关键字的方式出现 编译器能够帮助检查潜在的问题 非常方便的在代码中定位 支持动态类型识别(dynamic_cast) 来源: CSDN 作者: 划清界限 链接: https://blog.csdn.net

面试宝典6-12题

▼魔方 西西 提交于 2019-12-22 00:38:48
文章目录 6、short s1 = 1;s1= s1+1;有什么错?short s1=1;s1+=1;有什么错? 7、char型变量中能不能存储一个中文汉字?为什么? 8、如何用最有效的方法算出2乘以8等于几? 9、请设计一个百亿计算器 10、使用final关键字修饰一个变量时,是引用不能变,还是引用对象不能变? 11、“==”和equals方法究竟有什么区别? 12、静态变量和实例变量的区别? 6、short s1 = 1;s1= s1+1;有什么错?short s1=1;s1+=1;有什么错? 答:首先要知道, 数据类型之间的转换模式:大转小需要强制转换,小转大可以直接转换。 前者,编译器会报错,因为在java的默认整数类型是int,s1+1中 s1是short类型****1是默认的int整数类型 ,相加的结果是int类型(会被编译器隐式转换),用int类型的值赋值给short需要 强制类型转换 才可以。后者是由于在执行完s1+1运算之后会强制转换成+=符号前面的表达式的类型 ,所以就不会出错了。总结一句话就是s1+=1比s1=s1+1多了一步强制转换的过程. 7、char型变量中能不能存储一个中文汉字?为什么? 答:可以的。因为char类型被设计出来用于存放Unicode编码的,而Unicode编码字符中包含了汉字(不包括特殊汉字),所以char型变量是可以储存一个汉字的

基本数据类型的转换

核能气质少年 提交于 2019-12-21 17:00:19
Java类Demo中存在方法func0、func1、func2、func3和func4,请问该方法中,哪些是不合法的定义?( ) public class Demo{   float func0()   {     byte i=1;     return i;   }   float func1()   {     int i=1;     return;   }   float func2()   {     short i=2;     return i;   }   float func3()   {     long i=3;     return i;   }   float func4()   {     double i=4;     return i;   } } func1 func2 func3 func4 这道题考的是数据类型转换问题。由大到小需要强制转换,由小到大不需要。 A:return; 没有返回值,错误 B:short → float 无须强制转换,正确 C:long → float 无须强制转换(这个最选项容易出错),正确。 float占4个字节为什么比long占8个字节大呢,因为底层的实现方式不同。 浮点数的32位并不是简单直接表示大小,而是按照一定标准分配的。 第1位,符号位,即S 接下来8位,指数域,即E。 剩下23位,小数域,即M

java数据类型

半世苍凉 提交于 2019-12-18 11:07:00
Java语言是静态类型的(statical typed),也就是说所有变量和表达式的类型再编译时就已经完全确定。由于是statical typed,导致Java语言也是强类型(Strong typed)的。强类型意味着每个变量都具有一种类型,每个表达式具有一种类型,并且每种类型都是严格定义的,类型限制了变量可以hold哪些值,表达式最终产生什么值。同时限制了这些值可以进行的操作类型以及操作的具体方式。所有的赋值操作,无论是显式的还是在方法调用中通过参数传递,都要进行类型兼容性检查。 1. 数据类型: 在java源代码中,每个变量都必须声明一种类型(type)。有两种类型:primitive type和reference type。引用类型引用对象(reference to object),而基本类型直接包含值(directly contain value)。因此,Java数据类型(type)可以分为两大类:基本类型(primitive types)和引用类型(reference types)。primitive types 包括boolean类型以及数值类型(numeric types)。numeric types又分为整型(integer types)和浮点型(floating-point type)。整型有5种:byte short int long char

字节码指令表(查找使用)

我与影子孤独终老i 提交于 2019-12-14 22:20:46
字节码 助记符 指令含义 0x00 nop 什么都不做 0x01 aconst_null 将null推送至栈顶 0x02 iconst_m1 将int型-1推送至栈顶 0x03 iconst_0 将int型0推送至栈顶 0x04 iconst_1 将int型1推送至栈顶 0x05 iconst_2 将int型2推送至栈顶 0x06 iconst_3 将int型3推送至栈顶 0x07 iconst_4 将int型4推送至栈顶 0x08 iconst_5 将int型5推送至栈顶 0x09 lconst_0 将 long 型0推送至栈顶 0x0a lconst_1 将 long 型1推送至栈顶 0x0b fconst_0 将 float型0推送至栈顶 0x0c fconst_1 将 float型1推送至栈顶 0x0d fconst_2 将 float型2推送至栈顶 0x0e dconst_0 将 double型0推送至栈顶 0x0f dconst_1 将 double型1推送至栈顶 0x10 bipush 将单字节的常量值(Byte.MIN_VALUE ~ Byte.MAX_VALUE,即 -128~127)推送至栈顶 0x11 sipush 将短整型的常量值(Short.MIN_VALUE ~ Short.MAX_VALUE,即 -32768~32767)推送至栈顶 0x12 ldc

数组指针和指针数组

走远了吗. 提交于 2019-12-13 16:17:01
数组指针(也称行指针) 定义 int (*p)[n]; ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。 如要将二维数组赋给一指针,应这样赋值: int a[3][4]; int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。 p=a; //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0] p++; //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][] 所以数组指针也称指向一维数组的指针,亦称行指针。 指针数组 定义 int *p[n]; []优先级高,先与p结合成为一个数组,再由int*说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1时,则p指向下一个数组元素,这样赋值是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 *p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组: int *p[3]; int a[3][4]; p++; //该语句表示p数组指向下一个数组元素。注:此数组每一个元素都是一个指针 for(i=0;i<3;i++) p[i]=a