C语言强制类型转换

结论:

     C语言中,因为计算机均采用补码形式进行存放,且运算时会进行自动类型转换,因此不论有符号数还是无符号数,在强制转换中均采用统一法则:

     若被转换的数据类型低于int,则在转换时先自动转换为int型数据,然后再将int型转换为指定类型,即强制截断高位,若被转换数据类型等于int或unsigned int,则直接进行高位截断;

 

分析如下,以下分析假设以32位机作为平台:

     1、数据类型低于int,先默认转换为int型,用符号位进行高位填充,正数用0进行填充,负数用1进行填充,再进行高位截断。如:

          char(8位)类型的“-1”补码形式为,                                                                                                  1111 1111 ==> (-1)

          运算时会自动转换为int(32位)类型 即                                       1111 1111 1111 1111 1111 1111 1111 1111 ==> (-1)

          若将其强制转换为int(32位)类型,为                                          1111 1111 1111 1111  1111 1111 1111 1111 ==> (-1)

          若将其强制转换为unsigned short(16位)类型,即                                                        1111 1111 1111 1111 ==> (65535)

 

        unsigned char(8位)类型的“255”补码形式为,                                                                                 1111 1111 ==>(255)

       运算时会自动转换为int(32位)类型 即                                         0000 0000 0000 0000 0000 0000 1111 1111 ==> (255)

       若将其强制转换为int(32位)类型,为                                            0000 0000 0000 0000 0000 0000 1111 1111 ==> (255)

       若将其强制转换为unsigned short(16位)类型,为                                                            0000 0000 1111 1111 ==>(255)

 

     2、数据类型等于int或unsigned int,则直接进行高位截断。如:

        int(32位)类型的“-2”补码形式为,                                              1111 1111 1111 1111 1111 1111 1111 1110 ==> (-2),

        若将其转换为char(8位)类型,即将高24位强制截断,则为,                                                     1111 1110 ==> (-2)

        若将其转换为unsigned char(8位)类型,即将高24位强制截断,则为,                                      1111 1110 ==> (254)

 

       unsigned int(32位)类型的“4294967295”补码形式为,          1111 1111 1111 1111 1111 1111 1111 1111 ==> (4294967295)

        若将其转换为char(8位)类型,即将高24位强制截断,为                                                         1111 1111 ==> (-1)

        若将其转换为unsigned char(8位)类型,即将高24位强制截断,为                                         1111 1111 ==> (255)

       

     补充:

      计算机中,正数的原码、反码、补码均相同,负数的补码为反码+1,为什么计算机中要采用补码形式存放可参考此博客https://blog.csdn.net/qq_41727218/article/details/79521759

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值