C/C++ char 与 unsigned char 使用时要注意的问题

测试环境:Win10 Professional , CodeBlocks 13.12

#include <stdio.h>

int main()
{
    char ch1 = 0x01;
    char ch2 = 0x80;

    printf("ch1 = %x , size = %d\n",ch1, sizeof(ch1));
    printf("ch2 = %x , size = %d\n",ch2, sizeof(ch2));
    return 0;
}

//output:
// ch1 = 1 , size = 1
// ch2 = ffffff80 , size = 1

问题分析:

ch1 = 0 000 0001
ch2 = 1 000 0000

由于ch1 , ch2 是char , 根据系统的不同,char 的类型可能不同,我的环境默认的char 是 signed char (即有符号数),所以第一位是符号位,而在调用 printf("%x",ch)时,会进行位扩展,由原有的 8位 -> 32位,在进行位扩展时,有符号数的符号位左移,无符号数则直接填充0,所以会出现下面的结果:

ch1 = 0000....0000 0 000 0001 = 0x00000001 = 0x1
ch2 = 1111....1111 1 000 0000 = 0xffffff80 = 0xffffff80

而如果采用下面的写法:

#include <stdio.h>

int main()
{
    unsigned char ch1 = 0x01; //无符号数
    unsigned char ch2 = 0x80;

    printf("ch1 = %x , size = %d\n",ch1, sizeof(ch1));
    printf("ch2 = %x , size = %d\n",ch2, sizeof(ch2));
    return 0;
}


//output:
// ch1 = 1 , size = 1
// ch2 = 80 , size = 1

根据前面讲解:

ch1 = 0000....0000 0000 0001 = 0x1
ch2 = 0000....0000 1000 0000 = 0x80

 

转载于:https://my.oschina.net/tigerBin/blog/885332

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值