c语言强制转换四舍五入
- 格式:docx
- 大小:28.71 KB
- 文档页数:4
c语言term总体上必须清楚的:1)程序结构是三种:顺序结构、选择结构(分支结构)、循环结构。
2)读程序都要从main()入口,然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。
3)计算机的数据在电脑中保存是以二进制的形式.数据存放的位置就是他的地址.4)bit是位是指为0或者1。
byte是指字节,一个字节=八个位.概念常考到的:1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。
C 语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。
2、definePI3.1415926;这个写法是错误的,一定不能出现分号。
-3、每个C语言程序中main函数是有且只有一个。
4、在函数中不可以再定义函数。
5、算法:可以没有输入,但是一定要有输出。
6、break可用于循环结构和witch语句。
7、逗号运算符的级别最低,赋值的级别倒数第二。
第一章C语言的基础知识第一节、对C语言的基础认识1、C语言编写的程序称为源程序,又称为编译单位。
2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。
3、一个C语言程序有且只有一个main函数,是程序运行的起点。
第二节、熟悉vc++1、VC是软件,用来运行写的C语言程序。
2、每个C语言程序写完后,都是先编译,后链接,最后运行。
(.c—.obj—.e某e)这个过程中注意.c和.obj文件时无法运行的,只有.e某e文件才可以运行。
(常考!)第三节、标识符1、标识符(必考内容):合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线。
第一个为数字就错了2、标识符分为关键字、预定义标识符、用户标识符。
关键字:不可以作为用户标识符号。
maindefinecanfprintf都不是关键字。
迷惑你的地方If是可以做为用户标识符。
因为If中的第一个字母大写了,所以不是关键字。
预定义标识符:背诵definecanfprintfinclude。
计算机等级考试二级C语言常见知识点总结总体上必须清楚的:1)程序结构是三种: 顺序结构, 循环结构(三个循环结构), 选择结构(if 和switch)2)读程序都要从main()入口, 然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择)。
3)计算机的数据在电脑中保存是以二进制的形式. 数据存放的位置就是他的地址.4)bit是位是指为0 或者1。
byte 是指字节, 一个字节= 八个位.5)一定要记住二进制如何划成十进制。
概念常考到的:1、编译预处理不是C语言的一部分,不再运行时间。
C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。
2、每个C语言程序中main函数是有且只有一个。
3、在函数中不可以再定义函数。
4、算法的是一定要有输出的,他可以没有输入。
5、break可用于循环结构和switch语句。
6、逗号运算符的级别最低。
第一章1)合法的用户标识符考查:合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线。
第一个为数字就错了。
关键字不可以作为用户标识符号。
main define scanf printf 都不是关键字。
迷惑你的地方If是可以做为用户标识符。
因为If中的第一个字母大写了,所以不是关键字。
2)实型数据的合法形式:2.333e-1 就是合法的,且数据是2.333×10-1。
考试口诀:e前e后必有数,e后必为整数。
.3)字符数据的合法形式::'1' 是字符占一个字节,"1"是字符串占两个字节(含有一个结束符号)。
'0' 的ASCII数值表示为48,'a' 的ASCII数值是97,'A'的ASCII数值是65。
4) 整型一般是两个字节, 字符型是一个字节,双精度一般是4个字节:考试时候一般会说,在16位编译系统,或者是32位系统。
碰到这种情况,不要去管,一样做题。
c语言浮点数转换整数C语言中浮点数转换为整数是一种常见的操作,本文将介绍如何在C语言中实现浮点数转换为整数的方法。
在C语言中,浮点数是指带有小数部分的数字,而整数则是不带小数部分的数字。
浮点数转换为整数的过程就是去掉小数部分,只保留整数部分的操作。
C语言中提供了两种实现浮点数转换为整数的方法,分别是向下取整和向零取整。
1. 向下取整向下取整是指将浮点数转换为比它小但最接近的整数。
在C语言中,可以使用强制类型转换的方法实现向下取整。
例如,将浮点数3.14转换为整数的过程如下:```cfloat f = 3.14;int i = (int)f;```通过将浮点数强制转换为整数,可以得到整数3,即向下取整的结果。
2. 向零取整向零取整是指将浮点数转换为离它最近的整数,但是要保证转换后的整数不大于原浮点数。
在C语言中,可以使用数学库函数floor()实现向零取整。
例如,将浮点数3.14转换为整数的过程如下:```c#include <math.h>float f = 3.14;int i = floor(f);```通过使用floor()函数,可以得到整数3,即向零取整的结果。
需要注意的是,浮点数转换为整数时可能会出现精度丢失的情况。
由于浮点数的表示方式和整数的表示方式不同,转换过程中可能会导致小数部分的丢失。
为了避免精度丢失,可以在转换之前先对浮点数进行四舍五入,然后再进行转换。
例如,将浮点数3.14转换为整数的过程如下:```cfloat f = 3.14;int i = (int)(f + 0.5);```通过在浮点数上加上0.5再进行转换,可以得到整数3,即四舍五入的结果。
除了向下取整和向零取整外,C语言还提供了向上取整和四舍五入等其他取整方式。
可以根据具体需求选择合适的方法进行浮点数转换为整数的操作。
本文介绍了在C语言中实现浮点数转换为整数的方法,包括向下取整、向零取整和四舍五入等方式。
C语言知识要点复习资料总体上必须清楚的:1)程序结构是三种:顺序结构、选择结构(分支结构)、循环结构。
2)读程序都要从main()入口,然后从最上面顺序往下读(碰到循环做循环,碰到选择做选择),有且只有一个main函数。
3)计算机的数据在电脑中保存是以二进制的形式.数据存放的位置就是他的地址.4)bit是位是指为0或者1。
byte是指字节,一个字节=八个位.概念常考到的:1、编译预处理不是C语言的一部分,不占运行时间,不要加分号。
C语言编译的程序称为源程序,它以ASCII数值存放在文本文件中。
2、define PI3.1415926;这个写法是错误的,一定不能出现分号。
3、每个C语言程序中main函数是有且只有一个。
4、在函数中不可以再定义函数。
5、算法:可以没有输入,但是一定要有输出。
6、break可用于循环结构和switch语句。
7、逗号运算符的级别最低,赋值的级别倒数第二。
第一章C语言的基础知识第一节、对C语言的基础认识1、C语言编写的程序称为源程序,又称为编译单位。
2、C语言书写格式是自由的,每行可以写多个语句,可以写多行。
3、一个C语言程序有且只有一个main函数,是程序运行的起点。
第二节、熟悉vc++1、VC是软件,用来运行写的C语言程序。
2、每个C语言程序写完后,都是先编译,后链接,最后运行。
(.c---→.obj---→.exe)这个过程中注意.c和.obj文件时无法运行的,只有.exe文件才可以运行。
(常考!)第三节、标识符1、标识符(必考内容):合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线。
第一个为数字就错了2、标识符分为关键字、预定义标识符、用户标识符。
关键字:不可以作为用户标识符号。
main define scanf printf都不是关键字。
迷惑你的地方If是可以做为用户标识符。
因为If中的第一个字母大写了,所以不是关键字。
预定义标识符:背诵define scanf printf include。
C语言浮点型转换为整数型1. 前言在C语言中,我们经常需要进行不同数据类型之间的转换。
其中一种常见的转换是将浮点型数据转换为整数型数据。
本文将介绍如何在C语言中实现浮点型到整数型的转换,并提供一些示例代码。
2. 浮点型和整数型的区别在C语言中,浮点型和整数型是两种不同的数据类型。
2.1 浮点型浮点型数据用于表示实数,即带有小数部分的数字。
C语言中的浮点型数据有两种表示方式:单精度浮点型(float)和双精度浮点型(double)。
单精度浮点型占用4个字节,双精度浮点型占用8个字节。
2.2 整数型整数型数据用于表示整数,即不带小数部分的数字。
C语言中的整数型数据有多种表示方式,包括有符号整数和无符号整数,以及不同的字节大小(如int、short、long等)。
3. 浮点型转换为整数型的方法在C语言中,可以使用以下几种方法将浮点型数据转换为整数型数据。
3.1 强制类型转换强制类型转换是最简单的一种方法,可以通过将浮点型数据强制转换为整数型数据来实现转换。
强制类型转换使用的是C语言中的强制类型转换运算符(())。
float f = 3.14;int i = (int)f;在上述示例中,浮点型变量f的值为3.14,通过将f强制转换为整数型,将其赋值给整数型变量i,i的值将为3。
需要注意的是,强制类型转换会截断浮点数的小数部分,只保留整数部分。
这意味着,如果浮点数的小数部分较大,转换后的整数将丢失这部分信息。
3.2 向下取整除了使用强制类型转换,还可以使用向下取整的方法将浮点型数据转换为整数型数据。
向下取整是指将浮点数的小数部分直接舍去,只保留整数部分。
float f = 3.14;int i = (int)f;在上述示例中,浮点型变量f的值为3.14,通过将f强制转换为整数型,将其赋值给整数型变量i,i的值将为3。
需要注意的是,向下取整会丢失浮点数的小数部分,只保留整数部分。
这意味着,无论浮点数的小数部分是多少,转换后的整数都将是向下取整后的结果。
c语⾔强制转换四舍五⼊在C语⾔中,强制转换后的数是四舍五⼊还是去尾?去尾要想四舍五⼊的话(int)(number+0.5)都是直接去尾的。
当为数太多时直接截断。
所以在强制转换时要很注意C语⾔有没有数据的四舍五⼊?什么情况下会⽤到四舍五⼊?数据类型转换?有四舍五⼊的情况,在你想要保留⼏位⼩数的时候,多余的紧接着的⼀位要四舍五⼊不过C⾥⾯没有提供四舍五⼊的函数,不过你可以这样a = (int)(a*100 + 0.5)/100这只是⼀个⼩技巧,对a的第三位进⾏四舍五⼊提问者评价+0.5可以解决这个问题!谢谢你!C语⾔中的float和double类型数据是浮点数,所以⼩数部分就存在四舍五⼊问题,当指定输出位数在精度范围之内时,系统会⾃动舍⼊,⽆需⼈⼯⼲预,如果⼩数部分也在精度范围内,⽐如10.0/2.0 = 5.0,2位以上的输出位数时,后⾯的都是0,此时,当然不需要舍⼊了。
数据类型转换有两种⽅式,⼀种是默认强制转换,⽐如将char、short、Int、Long和float类型数据赋给double类型变量时,编译程序会⾃动实施转换,这是因为,在精度更⾼时,这样的转换是内有损失的。
另⼀种是⼿动强制类型转换,⽐如dnum = (double)inum;,意思是将整形变量inum⾸先转换为双精度数据,然后再付给dnum。
当将⾼精度类型变量赋给低精度类型变量时,除⾮⼿动强制转换,否则,编译程序会有提⽰的。
数据强制转换是⽤舍弃的⽅法,不会⽤四舍五⼊,什么时候⽤四舍五⼊是需要详细说明的,也就是你的业务需求⽽定,你可以把数字+0.5,然后进⾏强制转换ouble强制转换成int型的时候保留整数部分的。
⽐如double a=1.5;int b=a;a就是1。
C语⾔强制类型转换问题2012-03-11 17:52匿名|分类:C/C++ |浏览2634次int a,b; //keil c⾥的int,也就是16位。
a=0000; b=0x1234;a=(char)(b);问题:此时a的值是?a的类型是?分享到:2012-03-11 19:08提问者采纳你好!⼀步⼀步来int a,b;这句的功能是操作系统为变量a,b分别分配⼀块空闲的存储空间以后使⽤a,b将相当于访问各⾃所对应的存储空间a = 0000;b = Ox1234;这句的功能是把0000放到变量a所对应的存储空间把0x1234放到变量b所对应的存储空间重点是下⾯这句a = (char)(b)它的功能相当于修改变量a的值,具体是这样操作的,从b所对应的存储空间中取出b的值即0x1234,然后把他转换成char类型,再然后将转换后的结果放到变量a所对应的存储空间,即覆盖掉原来的0000这个转换后的结果⼜是多少呢,是这样算的通常在C中int类型占4个字节⽽char类型占1个字节如果把⼀个int类型的数据以char类型输出,那么,编译器会⾃动丢弃int类型的前3个字节的内容对应本题int类型的数据b是0X1234 为⼗六进制在计算机中是这样存储的0000 0000 0000 0000 0001 0010 0011 0100共4个字节转换成char类型后,前3个字节丢弃即结果是0011 0100 共1个字节对应的⼗进制是52当语句a = (char)(b)执⾏完后这1个字节的值也就是52就放到了变量a所对应的存储空间,⽽不是原来的0000了所以,整个过程并没有改变变量a和b的数据类型原来是int类型现在还是int型,程序只是修改了变量a的值,连b的值都没有修改,因为修改a的值时只是从b所对应的存储空间⾥把b的值取出来⽤⼀⽤,⽤的结果是修改成char类型,但他把修改后的结果放到a所对应的存储空间了,并没有放到b所对应的存储空间,所以原来b所对应的值没有被覆盖,原来是0X1234,现在还是0X1234仅供参考!呵呵追问晕,你肯定是⽤VC的,所以在你理解⾥,int型的为32位,⽽我题⽬中就说了,我⽤的是keil c,⼀个int型的点2个字节,也就是16位。
C语言中最重要的知识点总体上必须清楚的 :1)程序结构是三种 : 顺序结构、选择结构 ( 分支结构 ) 、循环结构。
2)读程序都要从 main() 入口 , 然后从最上面顺序往下读 ( 碰到循环做循环 , 碰到选择做选择) ,有且只有一个 main 函数。
3) 计算机的数据在电脑中保存是以二进制的形式 . 数据存放的位置就是他的地址 .4) bit 是位是指为 0 或者 1。
byte 是指字节 , 一个字节 = 八个位 .概念常考到的:1、编译预处理不是 C 语言的一部分,不占运行时间,不要加分号。
C 语言编译的程序称为源程序,它以 ASCII 数值存放在文本文件中。
2、 define PI 3.1415926;这个写法是错误的,一定不能出现分号。
3、每个 C语言程序中main 函数是有且只有一个。
4、在函数中不可以再定义函数。
5、算法:可以没有输入,但是一定要有输出。
6、 break 可用于循环结构和switch语句。
7、逗号运算符的级别最低,赋值的级别倒数第二。
第一章 C 语言的基础知识第一节、对 C 语言的基础认识1、 C语言编写的程序称为源程序,又称为编译单位。
2、 C 语言书写格式是自由的,每行可以写多个语句,可以写多行。
3、一个 C语言程序有且只有一个main 函数,是程序运行的起点。
第二节、熟悉 vc++1、 VC是软件,用来运行写的C语言程序。
2、每个 C 语言程序写完后,都是先编译,后链接,最后运行。
(.c---.obj---.exe )这个过程中注意.c 和 .obj文件时无法运行的,只有.exe文件才可以运行。
(常考!)第三节、标识符1、标识符(必考内容):合法的要求是由字母,数字,下划线组成。
有其它元素就错了。
并且第一个必须为字母或则是下划线。
第一个为数字就错了2、标识符分为关键字、预定义标识符、用户标识符。
关键字:不可以作为用户标识符号。
main define scanf printf都不是关键字。
C语言中强制数据类型转换2011-11-01 17:49:38| 分类:C/C++ | 标签:c语言类型转换|字号大中小订阅一、自动类型转换● 字符型变量的值实质上是一个8位的整数值,因此取值范围一般是-128~127,char型变量也可以加修饰符unsigned,则unsigned char 型变量的取值范围是0~255(有些机器把char型当做unsighed char型对待,取值范围总是0~255)。
● 如果一个运算符两边的运算数类型不同,先要将其转换为相同的类型,即较低类型转换为较高类型,然后再参加运算,转换规则如下图所示。
double ←── float 高↑long↑unsigned↑int ←── char,short 低● 图中横向箭头表示必须的转换,如两个float型数参加运算,虽然它们类型相同,但仍要先转成double 型再进行运算,结果亦为double型。
纵向箭头表示当运算符两边的运算数为不同类型时的转换,如一个long 型数据与一个int型数据一起运算,需要先将int型数据转换为long型,然后两者再进行运算,结果为long型。
所有这些转换都是由系统自动进行的,使用时你只需从中了解结果的类型即可。
这些转换可以说是自动的,但然,C语言也提供了以显式的形式强制转换类型的机制。
● 当较低类型的数据转换为较高类型时,一般只是形式上有所改变,而不影响数据的实质内容,而较高类型的数据转换为较低类型时则可能有些数据丢失。
二、赋值中的类型转换当赋值运算符两边的运算对象类型不同时,将要发生类型转换,转换的规则是:把赋值运算符右侧表达式的类型转换为左侧变量的类型。
具体的转换如下:(1) 浮点型与整型● 将浮点数(单双精度)转换为整数时,将舍弃浮点数的小数部分,只保留整数部分。
将整型值赋给浮点型变量,数值不变,只将形式改为浮点形式,即小数点后带若干个0。
注意:赋值时的类型转换实际上是强制的。
(2) 单、双精度浮点型● 由于C语言中的浮点值总是用双精度表示的,所以float 型数据只是在尾部加0延长为doub1e型数据参加运算,然后直接赋值。
c语言小数点进位取整在C语言中,小数点进位取整是一种常见的数值处理方式。
当我们需要对小数进行四舍五入或者进位取整时,可以使用一些简单的方法来实现。
首先,我们需要明确一些基本概念。
在C语言中,小数可以表示为浮点数或者双精度浮点数。
浮点数使用float类型表示,而双精度浮点数使用double类型表示。
这两种类型的小数都可以进行进位取整操作。
对于四舍五入操作,我们可以使用round函数来实现。
round函数的原型如下:```cdouble round(double x);```该函数接受一个双精度浮点数作为参数,并返回最接近该数的整数值。
如果参数x的小数部分大于等于0.5,则返回大于x的最小整数值;否则,返回小于x的最大整数值。
下面是一个使用round函数进行四舍五入的例子:```c#include <stdio.h>#include <math.h>int main() {double num = 3.7;double rounded = round(num);printf("原始数值:%f\n", num);printf("四舍五入后的整数:%f\n", rounded);return 0;}```运行上述代码,输出结果如下:```原始数值:3.700000四舍五入后的整数:4.000000```可以看到,原始数值3.7经过四舍五入后变为了4.0。
除了使用round函数,我们还可以使用floor函数和ceil函数来进行进位取整操作。
floor函数的原型如下:```cdouble floor(double x);```该函数接受一个双精度浮点数作为参数,并返回不大于x的最大整数值。
ceil函数的原型如下:```cdouble ceil(double x);```该函数接受一个双精度浮点数作为参数,并返回不小于x的最小整数值。
下面是一个使用floor函数和ceil函数进行进位取整的例子:```c#include <stdio.h>#include <math.h>int main() {double num = 3.7;double floored = floor(num);double ceiled = ceil(num);printf("原始数值:%f\n", num);printf("向下取整后的整数:%f\n", floored);printf("向上取整后的整数:%f\n", ceiled);return 0;}```运行上述代码,输出结果如下:```原始数值:3.700000向下取整后的整数:3.000000向上取整后的整数:4.000000```可以看到,原始数值3.7经过向下取整后变为了3.0,经过向上取整后变为了4.0。
在C语言中,强制转换后的数是四舍五入还是去尾?
去尾
要想四舍五入的话
(int)(number+0.5)
都是直接去尾的。
当为数太多时直接截断。
所以在强制转换时要很注意
C语言有没有数据的四舍五入?什么情况下会用到四舍五入?数据类型转换?有四舍五入的情况,在你想要保留几位小数的时候,多余的紧接着的一位要四舍五入
不过C里面没有提供四舍五入的函数,不过你可以这样
a = (int)(a*100 + 0.5)/100
这只是一个小技巧,对a的第三位进行四舍五入
提问者评价
+0.5可以解决这个问题!谢谢你!
C语言中的float和double类型数据是浮点数,所以小数部分就存在四舍五入问题,当指定输出位数在精度范围之内时,系统会自动舍入,无需人工干预,如果小数部分也在精度范围内,比如10.0/2.0 = 5.0,2位以上的输出位数时,后面的都是0,此时,当然不需要舍入了。
数据类型转换有两种方式,一种是默认强制转换,比如将char、short、Int、Long和float类型数据赋给double类型变量时,编译程序会自动实施转换,这是因为,在精度更高时,这样的转换是内有损失的。
另一种是手动强制类型转换,比如dnum = (double)inum;,意思是将整形变量inum首先转换为双精度数据,然后再付给dnum。
当将高精度类型变量赋给低精度类型变量时,除非手动强制转换,否则,编译程序会有提示的。
数据强制转换是用舍弃的方法,不会用四舍五入,什么时候用四舍五入是需要详细说明的,也就是你的业务需求而定,你可以把数字+0.5,然后进行强制转换
ouble强制转换成int型的时候保留整数部分的。
比如double a=1.5;
int b=a;
a就是1。
C语言强制类型转换问题
2012-03-11 17:52匿名|分类:C/C++ |浏览2634次
int a,b; //keil c里的int,也就是16位。
a=0000; b=0x1234;
a=(char)(b);
问题:
此时a的值是?a的类型是?
分享到:
2012-03-11 19:08提问者采纳
你好!
一步一步来
int a,b;
这句的功能是操作系统为
变量a,b分别分配一块空闲的存储空间
以后使用a,b将相当于访问各自所对应的
存储空间
a = 0000;
b = Ox1234;
这句的功能是
把0000放到变量a所对应的存储空间
把0x1234放到变量b所对应的存储空间
重点是下面这句a = (char)(b)
它的功能相当于修改变量a的值,
具体是这样操作的,从b所对应的存储空间中取出
b的值即0x1234,然后把他转换成char类型,再然后将
转换后的结果放到变量a所对应的存储空间,即覆盖掉
原来的0000
这个转换后的结果又是多少呢,是这样算的
通常在C中int类型占4个字节而char类型占1个字节
如果把一个int类型的数据以char类型输出,那么,编译器
会自动丢弃int类型的前3个字节的内容
对应本题
int类型的数据b是0X1234 为十六进制
在计算机中是这样存储的
0000 0000 0000 0000 0001 0010 0011 0100共4个字节
转换成char类型后,前3个字节丢弃
即结果是0011 0100 共1个字节对应的十进制是52
当语句a = (char)(b)执行完后
这1个字节的值也就是52就放到了变量a所对应的存储空间,
而不是原来的0000了
所以,整个过程并没有改变变量a和b的数据类型
原来是int类型现在还是int型,程序只是修改了变量a
的值,连b的值都没有修改,因为修改a的值时只是从b所
对应的存储空间里把b的值取出来用一用,用的结果是修改成
char类型,但他把修改后的结果放到a所对应的存储空间了,
并没有放到b所对应的存储空间,所以原来b所对应的值没有被
覆盖,原来是0X1234,现在还是0X1234
仅供参考!呵呵
追问
晕,你肯定是用VC的,所以在你理解里,int型的为32位,而我题
目中就说了,我用的是keil c,一个int型的点2个字节,也就是16
位。
当然这不影响理解“强制转换”这个概念。
总之,你的意思是:
a=(char)(b);
的结果是:a==0x0034,int型,b==0x1234,int型,对吗?
回答
最终结果:
变量a: int类型,其值是0x0034
变量b: int类型,其值不变,还是0x1234
我说的的确是vc中的,你的int类型是16个字节
那过程应该也一样,应该不影响你理解
呵呵
提问者评价
嗯,呵呵,谢谢大师!!
评论(3)|110
r1renhw|八级采纳率34%
擅长: C/C++ 数据结构及算法 C#/.NET JavaScript
其他类似问题
∙2007-12-25c语言中可以用强制类型转换8
∙2010-01-31c语言强制类型转换5
∙2013-04-30C语言中强制类型转换问题2
∙2013-10-14c语言题目强制类型转换1
更多关于c语言强制转换四舍五入的问题>>
按默认排序|按时间排序
其他3条回答
2012-03-11 17:56123冰霜雪月|六级
a是int型的
b是char型的
然后转换
类型转换就是(加上你要转的类型)
有问题再问
追问
这里b变成了char型??那它变成char型后值为多少?
它的值赋给a后,a类型不变?还有,a的值为多少?
评论|10
2012-03-11 18:26QQ925526512|四级
此时a的值是52,仍然是int型。
补:b的类型并没有发生变化,同样是int型,值也没有改变。
追问
a的值为0x0034?还是0x3400?
就是说,最终类型都不会变,只有在赋值的过程中暂时将b强制转换成char型,取低位(34)赋值给int型的a,a接收到一个char型的值的处理办法是也将这个值装在低位,对吗?
回答
1、(char)(b)是将b强制转换成char型(注:实际上b没有任何变化,你可以理解为一个中间结果。
),由于char只占8位,而b有16位,所以造成数据丢失(丢失的是高8位)。
2、将得到的8位赋值给a(16位),(注意!)两者类型不同,再次转换,低8位直接赋值,高8位全部补上0或1。
3、【先提及一下,计算机是以补码的形式存储数据的】
(char)(b)得到的是0x34,二进制原码为:0011 0100,补码为:0011 0100(正数的原码跟补码一样)。
2中提到的补0或补1,是由补码的最高位决定的,为0则补0,1则补1。
因此a最终的值为0 000 0000 0011 0100,化为十进制为52.
补:为什么要强调补0补1,及原码补码的问题?举个简单例子就能明白,若题目中的b的初值改为0x12F4,那么最终得到的a值将是-12 (十进制),而非0x00F4(16进制)
追问
同时也感谢你!!
只是百度的系统不能同时采纳两个标准答案*-*。