C语言隐式数据类型转换

C的隐式数据类型转换:

C语言中发生隐式数据类型转换的4种情况:
1.算数运算式中
2.赋值表达式中
3.函数调用参数传递时
4.函数返回返回值时

1.算数运算式中

进行算数运算时,不同数据类型必须转换成同一数据类型,才能进行运算。
1、字符必须先转换为整数
2、short型转换为int型
3、float型数据在运算时一律转换为双精度(double)型,以提高运算精度
4、在进行运算时,以表达式中所占字节最多的数据类型为主,其他数据的类型均转换为这种数据类型,再进行运算。

转换规则:

char,short ——>int——>unsigned——>long——>double<——float

2.赋值表达式中

进行赋值操作时,赋值运算符右边的数据类型必须转换成赋值号左边的类型,若右边的数据类型的长度大于左边,则要进行截断或舍入操作。

3.函数调用参数传递时

系统会隐式地将实参数据类型转换为形参数据类型后,再赋给形参。

4.函数返回返回值时

系统会隐式地将返回表达式的数据类型转换为函数返回值类型,再返回。

5.例题:

下列C程序执行后c输出结果为( )

#include<stdio.h>
#include<stdlib.h>
void main()
{
  int a = -3;
  unsigned int b = 2;
  long c = a + b;
  printf("%ld\n",c);
}
A.-1
B.4294967295
C.0x7FFFFFFF
D.0xFFFFFFFF

答案:(32位机器)A、(64位机器)B

先来补充点知识。

反码:正数的反码与原码相同; 负数的反码是对其原码逐位取反,但符号位除外。
内存中存放的是补码,正数的原码就补码,负数的补码是在其反码的末尾再加1。

正数的补码是原码,负数的补码是其原码除符号位外,按位取反再加1。

int型变量的取值范围是-2^31~2^31-1
正数:00000000 00000000 00000000 00000001~01111111 11111111 11111111 11111111。(原码补码一样)0~2^31-1
负数原码:10000000 00000000 00000000 00000001~11111111 11111111 11111111 11111111(-1~-(2^31-1))
负数补码:10000000 00000000 00000000 00000001(-(2^31-1))~11111111 11111111 11111111 11111111(-1)
还有一个数是10000000 00000000 00000000 00000000,不能用补码公式进行计算,计算机内部直接用它来表示-2^31。(-2^31原码补码都是它)

结束。

对于int a=-3
用二进制表示其原码是 10000000 00000000 00000000 00000011
用二进制表示其反码是 11111111 11111111 11111111 11111100
用二进制表示其补码是 11111111 11111111 11111111 11111101

对于unsigned int b=2
用二进制表示其原码是 00000000 00000000 00000000 00000010

算术运算时都转换为unsigned int
11111111 11111111 11111111 11111101
00000000 00000000 00000000 00000010
11111111 11111111 11111111 11111111

在32位机器上long是4字节,有个符号位,放不下2^32-1,所以会变为-1。
在64位机器上long是8字节,放得下2^32-1,所以得到答案4294967295。

下面代码输出什么

#include<stdio.h>
int main( )
{
    unsigned int a = 6;
    int b = -20;
    (a + b > 6) ? printf(">6") : printf("<=6");
    return 0;
}

输出结果是 ( )

答案:>6

a+b算术运算会转换成unsigned int 得到数很大,肯定是>6的。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值