关于char的溢出问题

2023-05-16

现在看下面的问题

int main()
{
    char number = 129; 
    printf(“number=%d\n”, number);
    return 0;
}

结果为什么是-127?

int main()
{
    char number = -129; 
    printf(“number=%d\n”, number);
    return 0;
}

结果为什么是127?

解析:首先要知道三点
第一点:大家知道char类型的取值范围是-128到127,这是char类型的存储空间限制的。char类型的变量占1个字节,最高位为符号位,0代表正数,1代表负数。这样char类型最大为(0111 1111)即127.存储范围不再它的取值范围的话会造成溢出。

第二点:数值数据在内存中是以数据的补码形式存放的,比如存放一个正整数127,由于正数的补码就是源码,所以存放在内存中即为0111 1111.而如果要存放一个负数-2,系统会首先得到该负数的补码(取绝对值后取反,再加1)即1111 1110,再保存存储起来。读取的时候执行相反操作。

第三点:char类型的变量在使用时系统会将其扩展为int类型,高24位补符号位。变量的正负通过扩展的24位决定,1代表负数,0代表整数。

结果:char number = 129时,赋值给number后,number代表的存储空间中存储的是1000 0001,但取出来的时候,因符号位是1,系统认为他是一个负数的补码,1000 0001其实就是-127的补码,故第一个输出的是-127;

char number = -129时,number代表的存储空间是0111 1111,因为,-129的原码是1 1000 0001,反码是1 0111 1110 ,补码是1 0111 1111.系统读低8位,也就是0111 1111,认为是一个正数,而0111 1111是127的补码,故输出127.

总述:可以这么理解:跟时钟的原理一样,绕圈圈,129时溢出了,比127多了2,则绕回2个,到了-127;num等于-129时,比-128少1,则绕回了127.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于char的溢出问题 的相关文章

随机推荐

  • protected 构造方法

    使用protected 构造方法 xff0c 是包保护措施 xff0c 出了这个包 xff0c 在别的包里面是不可以new这个对象的 假设class A 的构造函数是protected的 如果在别的包里还想用我这个类的功能 xff0c 只能
  • 简易小工具实现批量打开多个网页

    最近有个需求 xff0c 希望一次性可以打开多个网页 xff0c 网址自由指定 xff0c 这个需求的实现非常简单 xff0c 使用基本的c 43 43 代码调用system函数即可 xff0c 都不需要MFC相关的东西 但是我实测一些工具
  • STM32硬件复位后无法启动

    最近遇到一个很奇怪的问题 xff0c 把STM32的reset脚拉低后再拉高 xff0c 也就是所谓的硬件复位 xff0c 按道理来说 xff0c STM32应该重启才对 xff0c 可是并没有 xff0c 连main函数都没进去 xff0
  • c++ 除号 /

    在c 43 43 中 xff0c 经常会用到整数的除法 xff0c 但是值得注意的是整数的除法是有数据丢失的 整数除法的余数直接被丢弃 xff0c 只取了商的整数部分 不是四舍五入
  • SIP 鉴权 & HTTP 认证

    sip 鉴权是基于摘要签名认证的 具体来说 每一个用户都有一个用户名和密码 用户名和密码在客户端和SIP 服务器的数据库中都有保存 在认证的过程中 客户端将自己的信息 用户名 密码 url 等信息 做一些复杂的MD5 或者SHA256 SH
  • c++中的extern c以使用

    extern C 是c 43 43 可以正确使用c中代码而产生的 xff0c 虽然c 43 43 兼容c xff0c 但是在c 43 43 程序调用c的库时 xff0c 也会产生链接错误 因为c的库中函数的修饰规则与c 43 43 的函数修
  • 【C++】类与结构体的区别

    C 43 43 中结构体 xff08 struct xff09 我们知道C 43 43 中的 struct 对C中的 struct 进行了扩充 xff0c 它不再是只能用来封装不同类型数据的数据结构了 xff0c 而是拥有了更多的功能 xf
  • C++模板类成员函数最好和模板类声明一起放在同一个.h头文件里

    一个完整的C 43 43 程序应包括三部分 头文件 包含结构声明和使用这些结构的函数原型 头文件常包含的内容如下所示 xff1a 1 xff09 函数原型 2 xff09 使用 define或const定义的符号常量 3 xff09 结构声
  • 【VSCode】Visual Studio Code软件使用入门

    说明 这是一篇VS Code IDE软件使用入门文章 xff0c 工欲善其事 xff0c 必先利其器 xff0c 在使用新IDE之前 xff0c 不妨先对其进行一个全面了解 如果你做WPF等桌面端开发 xff0c 目前VSCode还没有好用
  • Elasticsearch 按字段进行分组 aggs 聚合 分组

    ES 按 userName 字段进行分组 统计 34 query 34 34 bool 34 34 must 34 34 range 34 34 operateTime 34 34 gt 34 34 2020 05 18 00 00 00
  • Hutool 操做excel 导出大数据 到excel

    1 hutool的版本 xff1a hutool all 4 5 15 2 POI 的版本 xff1a 3 17 lt dependency gt lt groupId gt org apache poi lt groupId gt lt
  • 使用vue-router携带不同参数多次push到一个页面时请求 不重新触发问题 ,只有第一次触发

    1 vue跳转 this router push path 39 user userDetils 39 query id JSON stringify val id name JSON stringify this searchData n
  • 惯性导航坐标系介绍

    常用坐标系定义 运载体中三维空间运动包含六个自由度 xff0c 既有角运动也有线运动 在地球表面附近 xff0c 运载体的角运动描述一般以当地水平面和地理北向为参考基准 xff1b 线运动的描述通常采用地理经度 纬度和高度表示 xff0c
  • 达梦 DM管理工具

    DM 管理工具是数据库自带的图形化工具 xff0c 可以方便快捷的对数据进行管理 在网络允许的条件下 xff0c 可通过单个管理工具 xff0c 对多个数据实例进行管理 xff0c 方便简化 DBA 对数据库的日常运维操作要求 打开DM管理
  • Windows 下 DM 的安装 和 数据库配置工具使用说明

    步骤 1 xff1a 运行安装程序 用户将 DM 安装光盘放入光驱中 xff0c 插入光盘后安装程序自动运行或直接双击 setup exe 安装程序后 xff0c 程序将检测当前计算机系统是否已经安装其他版本 DM 如 果存在其他版本 DM
  • window 下 达梦数据库的备份和还原

    DM 提供的各种工具进行备份还原与恢复的操作 xff0c 包括 DIsql工具 DMRMAN 工具 图形化客户端管理工具 MANAGER 和 CONSOLE DIsql 工具用于执 行联机的数据备份与数据还原 xff0c 包括数 归档备份据
  • Linux下与Windows的文件共享

    有三种方法 安装VMware Tools xff08 在虚拟机 gt 重新安装VMware Tools xff09 通过Winscp软件 xff08 前提Windows能ping通linux xff0c 和关防火墙 xff09 本文介绍 x
  • 关于大小端的经典问题

    源代码如下 xff1a span class hljs preprocessor include lt stdio h gt span span class hljs keyword int span main span class hlj
  • 关于#define宏的生命周期

    我们一起来看一段代码 xff1a span class hljs preprocessor include lt stdio h gt span span class hljs preprocessor define X 3 span sp
  • 关于char的溢出问题

    现在看下面的问题 span class hljs keyword int span main span class hljs keyword char span number 61 span class hljs number 129 sp