博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C/C++ char 与 unsigned char 使用时要注意的问题
阅读量:5817 次
发布时间:2019-06-18

本文共 1021 字,大约阅读时间需要 3 分钟。

hot3.png

测试环境:Win10 Professional , CodeBlocks 13.12

#include 
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 0001ch2 = 1 000 0000

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

ch1 = 0000....0000 0 000 0001 = 0x00000001 = 0x1ch2 = 1111....1111 1 000 0000 = 0xffffff80 = 0xffffff80

而如果采用下面的写法:

#include 
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 = 0x1ch2 = 0000....0000 1000 0000 = 0x80

 

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

你可能感兴趣的文章
PMP考试心得
查看>>
vxworks的tornado安装后遇到的sigproc_init:cannot create wait_sig thread......问题的解决方法!...
查看>>
Berkeley DB的增删改查的两种实现方式
查看>>
dfdf
查看>>
[转载] 信息系统项目管理师视频教程——26 业务流程管理
查看>>
在Windows Server 2003系统中为Web服务器申请证书
查看>>
一步步构建大型网站架构
查看>>
我的云课堂
查看>>
显示列表中的xenserver的总内存,可用内存,可用内存比【易读版】
查看>>
华为交换机板卡端口型号对照
查看>>
TX Text Control文字处理教程(13)实现拖放操作
查看>>
python学习-装饰器
查看>>
Visual Studio 20周年,我和VS不得不说的故事(内含福利)
查看>>
『中级篇』docker之CI/CD持续集成—GitLab CI服务器(71)
查看>>
部署Svn+Apache服务器
查看>>
通过读取用户和密码文件自动创建用户脚本
查看>>
实用贴 | 适用于开发者的最佳火狐插件
查看>>
硬盘SMART检测参数详解[转]
查看>>
NFS服务搭建与配置
查看>>
git别名
查看>>