关于c语言中的强制类型转换

    最近帮同学做c语言作业的时候想起来的 好久没写过c程序了 反正不管知不知道 都先做个备忘吧:
    首先 复制一下强制类型转换的形式(以下定义来自网络复制):
    强制类型转换是通过类型转换运算来实现的。其一般形式为:(类型说明符)(表达式)其功能是把表达式的运算结果强制转换成类型说明符所表示的类型。自动转换是在源类型和目标类型兼容以及目标类型广于源类型时发生一个类型到另一类的转换。例如: (float) a 把a转换为实型,(int)(x+y) 把x+y的结果转换为整型。
    有一点很基础的想说明一下:之前定义为int 然后之后进行输出或者计算的时候直接用%f或者诸如此类的方法不叫类型转换!而且还是错误的……= =比如:
<span style="font-family:SimHei;font-size:14px;">#include"stdio.h"
int main()
{
int a=9;
printf("%f",a);
}</span>


输出的是0.000000 完全不是我们想要的9.000000……
    进入正题:
1.这种转换是一种暂时性的转换 并不影响数据说明时对该变量定义的类型
举个栗子:
<span style="font-family:SimHei;font-size:14px;">#include"stdio.h"
int main()
{
float a=9;
printf("f=%d f=%f",(int)a,a);
}</span>


这段代码的输出是“f=9 f=9.000000”说明这只是暂时的改变 并没有根本性的改变a的数据类型
2.注意单引号
使用和不使用单引号的效果是不一样的
还是以上面这个程序为栗:
加以改变:
<span style="font-family:SimHei;font-size:14px;">#include"stdio.h"
int main()
{
float a=9;
printf("f=%d\t",a);
printf("f=%d",(int)'9');
}</span>


输出结果并不相同!“f=9 f=57(有的编译输出为0x39)”说明在输出的时候'9'被看成了9所对应的ascII码
这些都很容易注意到 但是在一些特殊情况下时 单引号也有很大的影响:
再举个栗子:
<span style="font-family:SimHei;font-size:14px;">#include"stdio.h"
int main()
{
float a=9;
printf("f=%f\n",a);
printf("f=%d\n",(int)'9');
printf("f=%d\n",'9');
printf("f=%d\n",12);
printf("f=%d\n",'12');
}</span>


输出结果为“9 57 57 12 12594”直接'9'输出的是57 参照上文还勉强可以理解 但是最后这个12594就有点奇葩了……
因为单引号!
因为'12'会被单独拆分成‘1’和‘2’来看待,1的ascII码是0x31 2的ascII是0x32,所以‘12’显示的实际上是存储12的内存单元的内容:0x3132 转换成十进制就是12594
3.在赋值语句中也存在转换 这种转换是隐式的 转换规则是赋值运算符右侧的类型转换成左边的类型 这里也同样有几点:
1)char类型赋给int类型的时候如果输入的是超过127(ascII码)的字符 有的编译器会直接当正数继续处理 有的则会转换成负数 不管怎样 其实质都没变 都能和这个字符唯一对应起来(因为ascII码表只有正值没有赋值 一旦出现赋值 则一定可以肯定是超过127以外的字符)
2)unsigned赋给int的时候 内部存储方式不变 外部值可能改变:
(unsigned)65535---->(int)-1
(int)-1----->(unsigned)65535
至于其他的诸如什么运算的时候发生的隐形转换 上课讲过了 就不备忘了
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值