C语言强制类型转换问题
inta,b;//keilc里的int,也就是16位。a=0000;b=0x1234;a=(char)(b);问题:此时a的值是?a的类型是?...
int a,b; //keil c里的int,也就是16位。
a=0000; b=0x1234;
a=(char)(b);
问题:
此时a的值是?a的类型是? 展开
a=0000; b=0x1234;
a=(char)(b);
问题:
此时a的值是?a的类型是? 展开
7个回答
展开全部
你好!
一步一步来
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
仅供参考!呵呵
一步一步来
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个字节
那过程应该也一样,应该不影响你理解
呵呵
展开全部
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
C语言的运算规律是(char、short)--->int------>unsigned------->long------->double<------float,
所以你第一第二个比较都是转换成unsigned
int型计算,-3在计算机是补码形式存在,大于100,更是大于3
第三第四十转换成double,float型变量是把整数部分放在23到30位,转换成double数当然很大,所以都比100大呀
所以你第一第二个比较都是转换成unsigned
int型计算,-3在计算机是补码形式存在,大于100,更是大于3
第三第四十转换成double,float型变量是把整数部分放在23到30位,转换成double数当然很大,所以都比100大呀
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
强制类型转换的一般形式为:(类型说明符)(表达式),例如: (float) a 把a转换为浮点型,(int)(x+y) 把x+y的结果转换为 整型
强制类型转换是通过类型转换运算来实现的。功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
注意事项:①类型说明符和 表达式都必须加括号(单个 变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
②无论是 强制转换或是自动转换,都只是为了本次运算的需要而对 变量的数据长度进行的临时性转换,而不改变数据说明时对该 变量定义的类型。
强制类型转换是通过类型转换运算来实现的。功能是把表达式的运算结果强制转换成类型说明符所表示的类型。
注意事项:①类型说明符和 表达式都必须加括号(单个 变量可以不加括号),如把(int)(x+y)写成(int)x+y则成了把x转换成int型之后再与y相加了。
②无论是 强制转换或是自动转换,都只是为了本次运算的需要而对 变量的数据长度进行的临时性转换,而不改变数据说明时对该 变量定义的类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
此时a的值是52,仍然是int型。
补:b的类型并没有发生变化,同样是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最终的值为0000 0000 0011 0100,化为十进制为52.
补:为什么要强调补0补1,及原码补码的问题?举个简单例子就能明白,若题目中的b的初值改为0x12F4,那么最终得到的a值将是 -12 (十进制),而非0x00F4(16进制)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询