以下代码在Windows控制台正常输出会出现乱码

#include<stdio.h>
int main(){char a=197;printf("%c",a);return 0;
}

为什么呢?

1. 我们先说明前提条件:C语言中char类型默认是有符号类型(范围是-128~127之间),当然也可以声明无符号类型的(unsigned char),这不在本文讨论范围之内。

在上列中,a = 197对应的字符是在标准ASCII表中是不存在的,标准ASCII表只定义了0~127的字符,而我们都知道一个字节可以表示0~255,因此多余的字节ASCII并没有使用,而是作为了扩展编码。因此之所以会输出问号或则其它乱码符号,是因为我们的ASCII编码中没有这个位置的编码符号。

2. 接下来接着说,我们中文家庭版的Windows10电脑里面,CMD中默认的编码格式是936(ANSI/OEM - 简体中文GBK)

通过以下一个引用大家可以高明白GBK编码和ASCII编码的关系。

【1】ASCII: 每个字符占据1bytes,用二进制表示的话最高位必须为0(扩展的ASCII不在考虑范围内),因此ASCII只能表示128个字
【2】GB2312: 最早一版的中文编码,每个字占据2bytes。由于要和ASCII兼容,那这2bytes最高位不可以为0了(否则和ASCII会有冲突)。在GB2312中收录了6763个汉字以及682个特殊符号,已经囊括了生活中最常用的所有汉字。
【3】GBK: 由于GB2312只有6763个汉字,我汉语博大精深,只有6763个字怎么够?于是GBK中在保证不和GB2312、ASCII冲突(即兼容GB2312和ASCII)的前提下,也用每个字占据2bytes的方式又编码了许多汉字。经过GBK编码后,可以表示的汉字达到了20902个,另有984个汉语标点符号、部首等。值得注意的是这20902个汉字还包含了繁体字。

补充:

【4】GB18030: 然而,GBK的两万多字也已经无法满足我们的需求了,还有更多可能你自己从来没见过的汉字需要编码。这时候显然只用2bytes表示一个字已经不够用了(2bytes最多只有65536种组合,然而为了和ASCII兼容,最高位不能为0就已经直接淘汰了一半的组合,只剩下3万多种组合无法满足全部汉字要求)。因此GB18030多出来的汉字使用4bytes编码。当然,为了兼容GBK,这个四字节的前两位显然不能与GBK冲突(实操中发现后两位也并没有和GBK冲突)。我国在2000年和2005年分别颁布的两次GB18030编码,其中2005年的是在2000年基础上进一步补充。至此,GB18030编码的中文文件已经有七万多个汉字了,甚至包含了少数民族文字。

  • 最终要的一点就是GBK编码格式适合ASCII编码格式兼容的,因此197自然也没有为它设计对应的字符。

  • 如果需要显示出来128~255的字符,我们就需要将控制台的编码格式改变,比如改成美国的一种编码标准:437(OEM-美国),就可以正常显示显示SCII码中128-255的特殊字符。

  • 最简单的方法就是在程序中加上以下的头文件和命令就可以修改代码页的默认显示方式:

#include<windows.h>
#include<stdio.h>
int main(){SetConsoleOutputCP(437);char a=197,b=198;printf("%c %c",a,b);
}
  • 通过以上修改,就可以正常显示197和198对应的字符,分别是 ┼ 和 ╞ ,当然这只是在一种编码格式下,如果再更换一种编码格式,可能又不一样。

3. 除此之外,C语言中,当char是有符号类型的时,即表示范围为-128~127。在有符号char类型当中0 ~ 127和-128~-1这两段在存储上分为两个不同的段。

十进制 对应的补码表示
-128 1000 0000
-127 1000 0001
-126 1000 0010
-125 1000 0011
-2 1111 1110
-1 1111 1111
0 0000 0000
1 0000 0001
127 0111 1111

这就是计算机中采用的补码表示法,二进制最高位代表符号位,1为负数,0为整数。

综上所述,数据在计算机中的存储形式是以补码的形式存储的,并且在C语言中有符号的char型,其负数段与正数段在内存的存储形式不一样(最高位),但其任然满足溢出取模原理

如有不足,欢迎指出。

关于C语言输出ASCII码128~255和有符号char型溢出的问题。此处大坑弄明白了后记录下来分享……相关推荐

  1. c语言输出字母是问号,关于C语言输出ASCII码128~255和有符号char型溢出的问题。此处大坑弄明白了后记录下来分享……...

    以下代码在控制台正常输出会出现乱码 #include int main(){ char a=197; printf("%c",a); return 0; } 为什么呢? 前提条件说 ...

  2. C语言输出ASCII码128~255和有符号char型溢出的问题记录

    C语言中char类型默认是有符号类型(范围是-128~127之间) 首先这个197对应的字符是在ASCII表中存在的,就像0~255的ASCII表中显示的一样,之所以会输出问号或则其他不知名符号(乱码 ...

  3. c语言putchar输出ascii码,putchar()参数有关问题

    putchar()参数问题 今天做习题遇到一个问题,代码如下,功能是输入数字和进制,利用递归把十进制输入的数字转换成想要的进制.但是最后输出时,我用putchar(r)就输出乱码,putchar('0 ...

  4. c语言知道ascII码求字母,c语言的ascii代码

    C语言中的" A"表示字母A还是ASCII码? _>>>如果a> 2,则此a必须是变量. 如果要比较字母和数字的ascii代码,则应添加单引号,例如'a'& ...

  5. C语言输出ASCII码表1/2

    C语言输出ASCII码表 1.输入代码,结果如下. 2.部分源代码 1.输入代码,结果如下. 2.部分源代码 #include "stdio.h" #include<stri ...

  6. 输入asc码输出字符c语言,输入一个字符输出ascii码

    C语言 输入一个字母,输出与之对应的ASCII码,输入用C语言编写. #include "stdafx.h" //VS 预编译头文件,其他系统请删除 #include #inclu ...

  7. c语言输出字母A的ascii值,ascii是什么意思_C语言中如何输出ASCII码

    描述 ASCII是AmericanStandardCodeforInformationInterchange的缩写,用来制订计算机中每个符号对应的代码,这也叫做计算机的内码(code). 1.ASCI ...

  8. C语言中字符数据超过127,如何用C语言显示ascii码超过127的字符

    C语言的程序代码如下: #include "stdio.h" main() {inti; for (i=1;i<256;i++) { printf("%c &quo ...

  9. 汇编原理实验--输出ASCII码10H到100H

    实验1:ASCII码 设计算法:为了将ASCII的10H到100H输出显示,得从10H开始显示输出然后循环90h次,每次ASCII自增1,重复上述步骤. 编程实现:将循环次数90h存在计数器cx中,用 ...

最新文章

  1. 美团Java面试154道题分享!
  2. 牛客 - 血压游戏(虚树+dp)
  3. Java程序员之完美代码
  4. linux 下对u盘分区吗,linux对中毒u盘分区和格式化
  5. eclipse查看jar包源代码
  6. 注册终止处理函数atexit()
  7. 100. Same Tree (Tree;DFS)
  8. C++中的->用于赋值
  9. 股票历史数据-股票前复权数据下载
  10. 苹果刷机未知错误75_徐州苹果售后维修中心
  11. matlab 根轨迹 系统单位阶跃响应,二阶系统单位阶跃响应MATLAB仿真设计.doc
  12. 圆形区域函数可视化和泊松方程求解
  13. 江开计算机应用基础第二次形考,江开计算机应用基础第二次形考作业
  14. 当你写爬虫抓不到APP请求包的时候该怎么办?【高级篇-混淆导致通用Hook工具失效】
  15. vue实现实时直播 摄像头实现实时直播 dplayer+flv flv.js
  16. 编辑中的word变成只读_word只读模式怎么取消,word只读模式怎么改
  17. 毕业论文使用的卡方检验该如何分析?
  18. 【tph-yolov5】tph-Yolov5的Pytorch环境配置和运行错误记录
  19. 性能优化之MySQL优化
  20. 企业群发短信时为什么要找短信平台公司而不是直接找运营商发送

热门文章

  1. WinINet 与 WinHTTP简介
  2. luckysheet报错
  3. 计算机无法 鼠标没反应,笔记本电脑鼠标动不了怎么办(鼠标没反应怎么解决)...
  4. Vue入门笔记Day 8
  5. mysql辅助索引非叶子节点_Mysql的聚集索引与辅助索引
  6. java利器下载_java利器app下载|
  7. GPT-4:不了不了,这些我还做不到
  8. ARM GPU Mali底层架构
  9. 微信小程序(一)认识微信小程序
  10. 【侯捷】C++内存管理从平地到万丈高楼(前11节学习笔记)