C 语言中的简单字符解释

2023-11-29

这是我的代码

 #include<stdio.h>

 void main()
 {
     char ch = 129;
     printf("%d", ch);
 }

我得到的输出为-127。这是什么意思?


代表着char是一个 8 位变量,只能保存 2^8 = 256 个值,因为声明是char ch, ch is a signed变量,这意味着它可以存储 127 个负值和正值。当您要求超过 127 时,该值将从 -128 开始。

可以将其想象为一些街机游戏,您可以从屏幕的一侧移动到另一侧:

ch = 50;

                                    ----->                        50 is stored
      |___________________________________|___________|           since it fits
    -128                       0         50          127          between -127
                                                                  and 128

通道=129;

                                                    ---           129 goes over
      -->                                                         127 by 2, so
      |__|____________________________________________|           it 'lands' in
    -128  -127                 0                     127          -127

但!!你不应该依赖它,因为它是未定义的行为!


为了纪念 Luchian Grigore,以下是所发生事件的位表示:

A char是一个保存 8 位或一个字节的变量。所以我们有 8 个 0 和 1 来努力代表你想要的任何值。如果char is a signed变量它将表示它是正数还是负数。您可能读过代表符号的一位,这是真实过程的抽象;事实上,它只是电子领域最早实施的解决方案之一。但这样一个简单的方法有一个问题,你有两种表示 0 的方法(+0 和 -0):

0 0000000     ->    +0        1 0000000     ->    -0                    
^                             ^ 
|_ sign bit 0: positive       |_ sign bit 1: negative

保证不一致!因此,一些非常聪明的人想出了一个称为“补码”的系统,它将负数表示为其正数的负数(非运算):

01010101      ->    +85
10101010      ->    -85

这个系统……也有同样的问题。 0 可以表示为00000000(+0) 和11111111(-0)。然后一些更聪明的人创建了补码,它将保留早期方法的负部分,然后加 1,从而删除那个讨厌的 -0 并为我们的范围提供一个闪亮的新数字:-128!那么我们的范围现在怎么样?

00000000     +0
00000001     +1
00000010     +2
...
01111110     +126
01111111     +127
10000000     -128
10000001     -127
10000010     -126
...
11111110     -2
11111111     -1

因此,这应该可以让我们了解当我们的小处理器尝试向变量添加数字时会发生什么:

 0110010     50                   01111111     127
+0000010    + 2                  +00000010    +  2
 -------     --                   --------     ---
 0110100     52                   10000001    -127
     ^                                  ^       ^
     |_ 1 + 1 = 10          129 in bin _|       |_ wait, what?!

是的,如果您查看上面的范围表,您可以看到最多 127 (01111111)二进制文件很好,没有什么奇怪的事情发生,但是在第 8 位设置为 -128 之后(10000000) 解释的数字不再保留其二进制大小,而是保留二进制补码表示形式。这意味着,二进制表示,变量中的位,1 和 0,我们心爱的人的心脏char,确实有 129...它在那里,看看它!但邪恶的处理器读取到 -127 会导致变量 HAD 变为signed破坏了它在一维欧几里得空间中的实数轴上发生臭味转移的所有积极潜力。

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

C 语言中的简单字符解释 的相关文章

随机推荐

  • 如何在Python3中像printf一样打印?

    在 Python 2 中我使用 print a d b d f x n g x n 我试过了 print a d b d f x n g x n 在Python2中 print是一个引入语句的关键字 print Hi 在Python3中 p
  • Android中如何同步两个scrollview?

    我有两个水平的scrollview 并希望将它们始终保持在相同的位置 距离 如果用户滚动其中一个 则需要以编程方式滚动另一个 挑战在于 将会发生无限循环 一个将提出另一个 另一个将首先提出 如何设置状态 指示用户启动的滚动仍在进行中 那么其
  • 错误:HHH000299:无法完成架构更新 java.lang.NullPointerException

    我在以下环境中有一个网络应用程序 JPA 2 0 春季3 2 2 MySQL 5 6 11 休眠 4 2 0 CR1 阿帕奇汤姆猫 7 0 35 到目前为止我的配置application context xml文件如下
  • 如何从 github 存储库安装打字稿定义

    如何为像 aurelia validatejs 这样的库安装 typescript defs 就像我所做的那样npm install aurelia validatejs save将其添加到package json and node mod
  • NHibernate - 映射字符串外键

    我继承的旧数据库包含以下表格 Teams TeamId INT PRIMARY KEY Name VARCHAR 30 Players PlayerId INT PRIMARY KEY Team VARCHAR 30 Players 表中的
  • 为什么我的代码在c++中无限循环。我的代码需要反复提示用户

    我的代码需要反复提示用户输入整数 当用户不再想继续输入数字时 输出用户输入的所有正数之和 然后输出用户输入的所有负数之和 这是我到目前为止所拥有的 include
  • 允许将 T* 与 char* 别名。反过来也允许吗?

    Note 该问题已被重命名并减少 以使其更加集中和可读 大多数评论都是指旧文本 根据标准 不同类型的对象不能共享相同的内存位置 所以这是不合法的 std array
  • nhibernate 查询所有实现接口的对象

    例如 如果您有一个 Apple IWhatever 和一个 Orange IWhatever 并且您想找到它们 因为它们都是 IWhatever 那么您需要在 NHibernate 中做什么 它是否完全依赖于 HQL 和条件查询 还是您还必
  • 修改查询字符串而不重新加载页面

    我正在创建一个照片库 并且希望能够在浏览照片时更改查询字符串和标题 我正在寻找的行为经常出现在连续 无限页面的某些实现中 当您向下滚动查询字符串时 会不断增加页码 http x com page 4 等等 理论上这应该很简单 但我想要一些在
  • 将图像字节数据流解码为 JPEG

    我正在努力成功地将 JPEG 图像从字节解码回 JPEG 我从 MJPG 字节流的编码帧开始 我想对其进行解码以便使用 OpenCV 进行操作 我是 Python numpy opencv 等方面的新手 我现在将帧 JPG 数据放在文本文件
  • Vanilla JS Div 碰撞检测

    我的以下实现可以在jsfiddle net 我有四个div 我的目标是使它们可以在页面上拖动 但不允许它们彼此重叠 每个都可以使用 mousemove 侦听器在页面上拖动 container addEventListener mousemo
  • 在哪里可以找到 PyQt5 方法签名?

    我想编写一个带有图形用户界面的小型应用程序 为此我安装了 PyQt5 在教程中 我发现 QMessageBox information 调用已完成 我想更改调用方式 而不是 QMessageBox information self Empt
  • IE 和 Webkit 移动设备中对最大图像像素大小是否有任意限制?

    最近的一个项目使用了非常像素大 5e3px2 但仍然是字节小 100kb GIF 的图像 IE8 和 iOS Safari 都拒绝渲染 两者似乎都知道图像大小 但只是不渲染它们 一个实用的解决方案是对图像进行切片 但是这些浏览器对最大图像像
  • 除了架构方面的考虑之外,为什么要在 Swift 中标记一些最终的东西呢?

    除了明显的原因 例如如果按照设计 我不希望某些方法 属性或任何内容在继承树中被覆盖 是否还有其他原因来标记事物final在斯威夫特 例如 是否有性能方面的考虑 我记得在某处读到过一些答案 其中提出了一些建议 来自 Apple 的 Swift
  • THREE.js - 广告牌顶点着色器

    我需要将 THREE Mesh 的实例定向为始终面向相机 我知道我可以只使用 THREE Mesh lookAt 方法 但我正在尝试更多地处理我的 GLSL 部分 并希望能够在顶点着色器中执行此操作 我已读完NeHe 的广告牌教程 这对我来
  • CSS 引用每个奇怪的嵌套子元素?

    我正在尝试制作一个评论系统 其中嵌套评论具有斑马背景颜色 蓝色背景回复白色背景回复蓝色背景 有没有办法引用这些嵌套的子项 而不是将它们称为 comment comment comment comment comment comment co
  • 使用 Bintray 在 jCenter 上发布 Android Studio 库时遇到问题

    我按照本教程在 Jcenter 上发布示例 Android Studio 库 http crushingcode co publish your android library via jcenter 看起来很清楚 我已通过此链接使用此库创
  • Databricks - 创建永久用户定义函数 (UDF)

    我能够创建一个 UDF 函数并使用 Spark UDF 方法注册到 Spark 但是 这仅限于每个会话 如何在Cluster启动时自动注册python UDF函数 这些功能应该可供所有用户使用 示例用例是将时间从 UTC 转换为本地时区 这
  • 字符串未被识别为有效的日期时间“格式 dd/MM/yyyy”

    我正在尝试将字符串格式化值转换为具有格式的日期类型dd MM yyyy this Text 22 11 2009 DateTime date DateTime Parse this Text 问题是什么 它有第二个覆盖 要求IFormatP
  • C 语言中的简单字符解释

    这是我的代码 include