分享

字长、int整型与隐式类型转换

 昵称5557379 2017-04-29

先说我之前编程的错误

例一:

u16 u16a = 0xFFFF;

u16 u16b = 0x01;

u32 u32c = 0x00;

u32sum = u16a + u16b + u32c;

                                 

u32sum是等于0x10000,还是0x0呢,

我只敢说,不知道,这和CPU的字长有关系。

 

例二:

u16 u16a = 0xFFFF;

u16 u16b = (~u16a)>>4;

u16b最终是等于多少呢,是0x0吗,会不会是0xF000呢,

我只敢说,不知道,这和CPU的字长有关系。

 

         int整型在C语言中,可能等同于short int,也可能等同于lont int。这取决于CPU的字长,16位的CPUshort int32位的CPUlong int。其他整形操作数(char\shot\bit-fieldenum)在数值操作前总是先转化为intunsigned int类型。

         整数提升的规则是,如果int类型能够代表原来类型的所有值,那么small interger就会隐性提升为int类型,否则就会转化为unsigned int

         这一隐式的类型转换会带来许多的潜在的风险。

 

         先看第一例子,

         u32sum = u16a + u16b + u32c;

         32CPU中,u16au16b在运行之前,会隐式提升为s32位整型,然后再进行相应的运算,这样最终的结果是0x10000

         16CPU中,u16au16b运行完成后,由于折叠了0x100000x0000,与u32c运算之前,先会进行平衡转换,转换成u32整型,最终答案是0x0

        

         再看第二个例子。

         u16b = (~u16a)>>4;

         16CPU中,0xFFFF按位取反即为0x0000,再向右移位,仍为0x0000

         在32位CPU,u16a在运算之前会进行整型提升,变成s32整型的0xFFFF,按位取反为0xFFFF0000,再向右移4位再截取,即为0xF000。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多