C语言中的无符号扩展和有符号扩展


前言

C语言中,当不同类型的数据进行运算时,会发生强制或隐式类型的转换,通常是低精度的数据类型扩展到高精度类型。
这就得考虑扩展时是补0还是补1了。

扩展原则

1.有符号的数据类型,在向高精度扩展时,总是带符号扩展
2.无符号的数据类型,在向高精度扩展时,总是无符号扩展

例子

#include <cstdio>
#include<cstdlib>
int main(){
    char ca=128;
    unsigned char ucb=128;
    unsigned short usc=0;
    //①
    usc=ca+ucb;
    printf("%x\n",usc);
    //②
    usc=ca+(unsigned short)ucb;
    printf("%x\n",usc);
    //③
    usc=(unsigned char)ca+ucb;
    printf("%x\n",usc);
    //④
    usc=ca+(char)ucb;
    printf("%x\n",usc);

    system("pause");
}

①对于char类型ca,有符号,且 \(128_{10}=1000\quad0000_2\) 溢出,第一位为符号位,它扩展成unsigned short时,带符号位扩展,符号位为1,故在前面补1,结果是1111 1111 1000 0000。而对于unsigned char 类型的ucb,二进制是1000 0000,无符号,扩展成unsigned short时往前补0,结果是0000 0000 1000 0000,相加结果为1 0000 0000 0000 0000。由于unsigned short是二字节,舍弃最前面的1,所以得到0x0。


②情况和1一样,只是将ucb显示强制转换为unsignedshort,所以得到0x0。


③ca先强制转换为unsigned char,仍然是1000 0000,注意此时转换后已经是一个无符号数,所以再往unsigned short扩展时,为无符号扩展,结果为0000 0000 1000 0000,ucb扩展后也是0000 0000 1000 0000,相加结果为0000 0001 0000 0000,所以结果为0x100。


④ca转为unsigned short,带符号扩展,为1111 1111 1000 0000,ucb先强制转换为char,然后再转为unsigned short,此时也要带符号扩展,所以也是1111 1111 1000 0000,两数相加,得到1 1111 1111 0000 0000,所以结果为0xff00。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM