柳叶lhy 2020-03-12 20:50 采纳率: 50%
浏览 366
已采纳

《Primer c++》中无符号类型赋值一个超出其范围的值,会出错吗??

今天在看《Primer c++》第五版的时候,看到书上说: 当我们赋值给无符号类型一个超出其范围的值时,结果是初始值对无符号类型表示数值总数取模后的余数。

#include<iostream>
using namespace std;
int main()
{
    unsigned char j=-1;
    cout<<"unsigned char j= "<<j<<endl;
    unsigned int i=-1;
    cout<<"unsigned int i= "<<i<<endl;
    return 0;
}

运行结果:

图片说明

对于unsigned int 类型的运行是没有错误的,而unsigned char 类型却不输出,这是什么原因呢?

请大佬指点。

  • 写回答

1条回答 默认 最新

  • BugM 2020-03-16 17:00
    关注

    在计算机中,数字是以其补码表示的,正数的补码和原码相同,负数的补码为其绝对值的反码再加1.
    因此对于一个字节的char类型,1的补码为00000001, -1的补码为11111111。

    由于无符号数没有符号位,所以-1的补码11111111的第一位不再表示符号位,其值对应的十进制值就为255。
    而cout对char类型的输出是输出其ascii码值代表的字符,也就是说这里应该输出ascii码为255的字符
    ascii码128到255,用于表示框线、音标、欧洲非英语系字母。如图可以看到,255没有输出什么东西
    图片说明

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 保护模式-系统加载-段寄存器