有符号数转无符号数的扩展问题

首先,计算机中为什么要有补码?

答案是使符号位参加运算,从而简化加减法的规则,使减法运算转成加法运算,从而简化机器的运算器。计算机中无论是字符类型,或者是整数类型,也无论这个整数是几个字节。它都用全1来表示 -1。比如一个字节的数值中:1111 1111表示-1,那么,1111 1111 - 1 是什么呢?和现实中的计算结果完全一致。1111 1111 - 1 = 1111 1110,而1111 1110就是-2。这样一直减下去,当减到只剩最高位用于表示符号的1以外,其它低位全为0时,就是最小的负值了,在一字节中,最小的负值是1000 0000,也就是-128。

正数: 最高有效位为0表示符号为正,数的其余部分则表示数的绝对值
负数: 用一个简单的方法来表示负数负数相对应的正数,用补码表示,按位取反,最后在末位(最低位)加1

用补码表示数时的符号扩展问题。比如从8位扩展到16位,从16位扩展到32位
正数的扩展应该在前面补0,而负数的扩展则应该在前面补1(不管是扩成有符号的还是无符号的)


下面再看两个程序:

1、

int main()
{
    int i;
    char c;
    
    c = (char)128;
    i = c;
    
    printf("%d,%u", i, i);
    
    getchar();
}

结果是 -128,4294967168

c= 0x80 = 1000 0000 

i= 0xFFFF FF80

2、

int main()
{
    unsigned int i;
    char c;
    
    c = -1;
    i = (unsigned)c;
    
    printf("%d,%u", i, i);
    
    getchar();
}

结果是 -1,4294967295

c = 0xFF = 1111 1111  

i= 0xFFFF FFFF(转成无符号的,也是在前面补1)

3、

int main()
{
    int i;
    char c;
    
    c = -1;
    i = (unsigned char)c;
    
    printf("%d,%u", i, i);
    
    getchar();
}

结果是255,255

c = 0xFF

i=0xFF
————————————————
补:当数值增加或减少到溢出时,下一个数是另一头那个数,比如,有符号char的127再加1,则值变成了-128,-128再减1则变成127。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值