C语言char类型的存储

news2024/11/20 10:28:33

目录

  • char是如何存储的
  • char的类型
  • char的取值范围
  • 例题

char是如何存储的

字符型(char)用于储存字符(character),如英文字母或标点。但是char类型在内存中并不是以字符的形式储存,而是以ASII码的形式储存,也可以说char类型储存的实际上是整数。所以char类型也被归类为整形家族。

int main()
{
	char c = 'A';
	printf("%d\n", c);
	printf("%c\n", c);
	return 0;
}

从上面的代码可以看出,因为char类型储存的是整形,所以可以以正数的形式打印出
在这里插入图片描述
打开内存窗口,也可以看出char是以整数的形式存储:
在这里插入图片描述
在这里插入图片描述

既然知道char实际上是整形,所以也可以用int类型对char类型赋值

int main()
{
	char c = 65;
	printf("%d\n", c);
	printf("%c\n", c);
	return 0;
}

%d输出就是输出存储在内存中的整形,以%c输出就会输出初始化时整数对应的ASKII码字符
在这里插入图片描述


其实关于由int类型对char赋值,以及对于char类型之间的运算,其实都会经历一个操作叫做:整形提升,整形提升的详细介绍在另一篇文章里👉点击跳转


char的类型

当听到char的类型这句话时,第一反应应该会是:“char的类型不就是char嘛”
其实不然,char类型实际上分区为有符号的signed char和无符号的unsigned char

你可能对有无符号可能会陌生,对于有无符号我在另一篇文章里详细介绍了👉点击跳转

对于char的有无符号位比较特殊的是:

  • charsigned char不一定等价
  • char默认是signed char还是unsigned char取决于编译器
  • 在常见的编译器里,char类型都默认为signed char

char的取值范围

char类型占1个字节,也就是8个比特位
所以char在内存中以00000000开始,逐渐递增,到011111111,在增加到100000000,最后到11111111,如下图:
在这里插入图片描述

对于signed char来说:

00000000为0,逐渐递增到011111111为127,因为第一位是符号位,所以再+1后的100000000为负数。
从最下面的开始算,11111111为-1,向上逐渐递减,到100000001时,为-127,所以100000000为-128。
在这里插入图片描述

所以,有符号的char的取值范围是:-128 ~ 127

对于unsigned char来说:

当二进制最高好比特位的数为0时,无符号的char与有符号的char相同,当制最高好比特位的数为1时,因为是无符号的char,所以100000000为128,直到11111111为255
在这里插入图片描述

所以,无符号的char的取值范围是:0 ~ 255

下面这幅图可以形象地表示出char类型数据范围
在这里插入图片描述

其实,这个图还可以体现出char类型的“循环”
在给char类型赋值为超过它的取值范围的值时,在char中的会按照图中的循环方向进行存储值,这其实是由于整形提升导致的,但是通过照着这个图会比分析整形提升的过程更方便得出实际char中的值

int main()
{
	char c = 129;
	printf("%d", c);
	return 0;
}

这个程序输出是-127,而不是129
在这里插入图片描述

此代码中,char类型默认是有符号的char,它的取值范围是-128 ~ 127,但是给c赋值为129,超出了取值范围
所以照着图就可以看出:129超了127两位,在图里127向后走两位就是-127

无符号整形也是如此。


例题

例1

//输出什么?
#include <stdio.h>
int main()
{
  char a= -1;
  signed char b=-1;
  unsigned char c=-1;
  printf("a=%d,b=%d,c=%d",a,b,c);
  return 0;
}

在这里charsigned char是一个意思,有符号的char取值范围是-128 ~ 127,-1在这个范围中,所以a,b 都输出 -1
无符号的范围是0 ~ 255,-1不在这个范围里,根据起面的循环图,c中存放的是255
在这里插入图片描述

例2

//输出结果是什么?
int main()
{
  char a[1000];
  int i;
  for(i=0; i<1000; i++)
 {
    a[i] = -1-i;
 }
  printf("%d",strlen(a));
  return 0;
}

答案是:255
因为strlen是遇到\0就结束,也就是遇到0就结束
a[i]的值从-1,-2,-3到-128,再到127,126……0
这之间一共有255个数,所以结果是255

例3

//输出结果是什么?
#include <stdio.h>
unsigned char i = 0;
int main()
{
  for(i = 0;i<=255;i++)
 {
    printf("hello world\n");
 }
  return 0;
}

答案是:死循环

因为这里的i是无符号的char,范围是0 ~255,随着for循环的进行,当i==255时,再加1,i变为0,仍然小于255,所以是死循环


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/147497.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

python对接API二次开发高级实战案例解析:Zabbix API封装类实现获取认证密钥、所有主机组、所有主机、所有监控项和历史数据

Zabbix API是基于Web的API&#xff0c;作为Web前端的一部分提供。它使用JSON-RPC 2.0协议&#xff0c;这意味着两点&#xff1a; 该API包含一组独立的方法&#xff1b;客户端和API之间的请求和响应使用JSON格式进行编码。 传送门&#xff1a;Zabbix API官方文档 导入模块 在za…

单线程Reactor模型

单线程Reactor模型 Reactor模型只是对select\poll\epoll等网络模型的封装&#xff0c;本文讲解基于epoll实现Reactor模型 Reactor模型 单线程Reactor模型较为简单&#xff0c;如图&#xff1a; 服务器接收多个client连接请求后&#xff0c;统一交由Reactor处理&#xff0c;其…

Qt—QPainter基本图形绘制详解

QPainter描述1、QPainter 类在小部件和其他绘制设备上执行低级绘制。2、QPainter 提供了高度优化的功能来完成大多数图形GUI程序所需的工作。它可以画从简单的线条到复杂的形状。它还可以绘制对齐的文本和像素图。QPainter 可以对继承 QPaintDevice 类的任何对象进行操作。3、Q…

【追光者】2022年终总结,又是一个开始,新的挑战。愿你历尽千帆,归来仍是少年。

本文为我原创&#xff0c;未经授权&#xff0c;禁止转载&#xff0c;本文首发于 CSND博客。 这几天&#xff0c;前前后后&#xff0c;断断续续&#xff0c;一边写博客&#xff0c;一边学习&#xff0c;一边回顾我的2022&#xff0c;打磨了好几天&#xff0c;尽管还是有好多想说…

指针进阶之函数指针和函数指针数组

文章目录一、函数指针1.简单介绍2.回忆函数3.函数地址4.函数指针5.案例&#xff08;1&#xff09;案例一&#xff08;2&#xff09;案例二&#xff08;3&#xff09;案例三&#xff08;4&#xff09;案例四代码1代码2误区6.补充二、函数指针数组1.定义2.补充3.案例&#xff08;…

剑指offer----C语言版----第十二天

目录 打印从1到最大的n位数 1.1 题目描述 1.2 Leetcode上的解题思路 1.3 考虑大数的问题 1.3.1 使用字符串模拟数字的加法 1.3.2 使用全排 打印从1到最大的n位数 原题链接&#xff1a;剑指 Offer 17. 打印从1到最大的n位数 - 力扣&#xff08;LeetCode&#xff09;1.1 题…

算法刷题打卡第58天:删除排序链表中的重复元素

删除排序链表中的重复元素 难度&#xff1a;简单 给定一个已排序的链表的头 head &#xff0c;删除所有重复的元素&#xff0c;使每个元素只出现一次。返回已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,1,2] 输出&#xff1a;[1,2]示例 2&#xff1a; 输入…

Cesiumlab对人工模型、建筑矢量面和BIM模型的处理参数设置 CesiumLab系列教程

CesiumLab中将人工模型&#xff08;fbx、obj&#xff09;、建筑矢量面&#xff08;shp&#xff09;和BIM模型&#xff08;clm&#xff09;的处理都集中在一起&#xff0c;统一使用通用模型处理。 输入文件部分&#xff0c;加载文件在这里不在赘述&#xff0c;输入了文件后&…

陪诊系统搭建,陪诊平台应当具备什么功能?

随着近些年来市场的变化&#xff0c;陪诊服务也在慢慢的受到人们的关注&#xff0c;自从有了陪诊系统之后&#xff0c;帮助了许许多多独立就医不便的人群&#xff0c;给了像是搞不清就诊流程的老年人、家人不方便陪伴的孕妇、残障人士&#xff0c;以及需要陪伴就医的独居人士等…

上海市“专精特新”中小企业和杨浦区“专精特新”中小企业给予5万元和3万元资助

杨浦区“专精特新”中小企业认定一、主管部门杨浦区商务委员会二、政策依据《关于印发<杨浦区“专精特新”中小企业培育工程实施办法>的通知》&#xff08;杨商务委规〔2018〕1号&#xff09;《关于组织推荐2021年度杨浦区“专精特新”中小企业申报(复核)的通知》三、扶持…

【Qt】加载.ui转化的.h头文件显示窗体

【Qt】加载.ui转化的.h头文件显示窗体1、背景2、实例3、验证1、背景 将.ui文件转化为.h头文件参考如下博客&#xff1a; 【Qt】将QtDesigner生成的.ui文件转化为.h头文件 https://jn10010537.blog.csdn.net/article/details/128589666其中生成的ui_widget.h头文件内容如下&am…

TensorFlow之超级参数调优

Keras技术框架提供工具类库&#xff0c;用于对TensorFlow程序相关的超级参数进行调优&#xff0c;为机器学习选择正确的超级参数集合的过程被称之为超级参数调优。 超级参数是指用于治理一个机器学习模型的训练过程及其拓扑结构的变量&#xff0c;这些变量在整个训练过程中保持…

尚医通-项目启动过程

1.先启动Redis&#xff1a; redis-server redis.conf & 2.启动docker&#xff1a; systemctl start docker 3.进入mongo容器&#xff1a; docker exec -it mymongo /bin/bash 4.使用MongoDB客户端进行操作 mongo 5.启动nginx&#xff1a;cmd 输入命令nginx 前期使…

【Kotlin】空安全 ③ ( 手动空安全管理 | 非空断言操作符 !! | 使用 if 语句判空 )

文章目录一、非空断言操作符 !!二、使用 if 语句判空一、非空断言操作符 !! Kotlin 中的 可空类型 变量 , 在运行时 可以选择 不启用 安全调用 操作 , 在调用 可空类型 变量 成员 与 方法 时 , 使用 非空断言操作符 !! , 如果 可空类型 变量为 空 , 则 直接抛出 空指针异常 K…

部署k8s集群

环境准备准备三台虚拟机&#xff0c;建议最小硬件配置&#xff1a;2核CPU、2G内存、20G硬盘 &#xff0c;可以访问外网&#xff0c;&#x1f4a1;ps&#xff1a;以下命令在三台虚拟机上都要执行一遍&#xff0c;直到kubeadm init设置虚拟机hostname sudo hostnamectl set-hostn…

性能优化系列之『混合式开发:小程序内核及优势介绍』

文章の目录一、愿景二、技术优势三、底层内核四、行业背景五、选型建议写在最后一、愿景 触手可及&#xff1a;用户扫一扫或者搜一下即可打开应用用完即走&#xff1a;不用关心是否安装太多应用 二、技术优势 H5 相比 App 开发&#xff0c;开发门槛更低优于 H5&#xff0c;接…

指针进阶篇(1)

目录 &#x1f914; 前言&#x1f914; 一、&#x1f60a;字符指针&#x1f60a; 二、&#x1f61c;指针数组&#x1f61c; 三、&#x1f61d;数组指针&#x1f61d; 3.1数组指针的定义 3.2&数组名VS数组名 3.3数组指针的使用 四、&#x1f31d;数组参数&#xff0c…

LeetCode算法之----回溯

目录 【一】前言 【二】全排列 【三】电话号码的字母组合 【四】括号生成 【五】组合总和 【六】子集 【七】总结 【一】前言 回溯算法采用试错的思想&#xff0c;尝试分步的来解决一个问题。在分步解决问题的过程中&#xff0c;当它通过尝试发现现有的分步答案不能得到有效的…

helm、k8s dasboard、rancher、kubesphere介绍及使用

文章目录1. helm 安装及使用概述1.1 helm 安装1.1.1 添加仓库1.2 helm 常用命令2. dashboard 部署使用2.1 安装helm repo 源2.2 安装dashboard2.3 查看dashboard 运行状态2.4 创建dashboard-admin.yaml文件2.5 创建登录用户2.6 查看admin-user账户的token2.7 登录dashboard2.8 …

非对称加密实战(二):解决web项目不支持https问题 ,添加证书【附源码】

目录web项目http请求变为https请求解决无法访问https问题重启再次访问https出现链接不安全,但是可以继续访问认证文件加入域名参数生成客户端认证文件证书安装源码地址web项目 http请求变为https请求 http请求 https请求 解决无法访问https问题 需要把 非对称加密实战(一…