c++ - 为什么输出这个结果?
黄舟
黄舟 2017-04-17 14:27:24
[C++讨论组]
    unsigned short val1 = 0xa500;
    short val2 = 0xa500;
    printf("%0x\n",val1);//输出a500
    printf("%0x\n",val2);//输出ffffa500
黄舟
黄舟

人生最曼妙的风景,竟是内心的淡定与从容!

全部回复(3)
PHPz

因为short的范围是-32768到32767,而0xa500是42240,超过范围了,实际是-23296,所以会按补码来存,低16位的补码是a500,高16位是符号位,-1的补码是ffff,因此一起就是0xffffa500
而unsigned short的范围是0到65535,没超范围,所以一切正常

巴扎黑

当把0xa500赋值给一个2字节变量时,其二进制是1010010100000000,对于这么一个16位二进制,解读为16位无符号整数就是0xa500,解读为16位有符号整数就是-23296(自行根据反补码规则解读)

然后问题来了
当你用在printf中以%x输出时,注意,%x意味着输出一个四字节十六进制整数,所以此时你的变量已经被隐式转换到四字节了!

对于正整数,隐式转换就是在前面补0,即变为00000000000000001010010100000000,即0xa500
然而对于负数,隐式转换会按照负数补码规则,在高16位填充1,变成11111111111111111010010100000000,即0xffffa500

迷茫

去学编码基础,有符号类型即便你赋值形式和无符号一样,也得用补码啊,怎么会一样

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号