C语言字符型变量的存储和取值

目录

1.问题引入

2.字符型变量的存储

3.字符型变量的取值

4.字符型变量中的-128

5.取值转换图


1.问题引入

        我们知道,在C语言中,一个字符型数据占8个bit位,那么当我们定义一个字符型数据,我们需要给它赋上什么范围的值才合适呢。是[-127,127],还是[-128,127],亦或者是[-127,128]?下面就让我们进入本篇文章的内容:字符型变量的存储取值

2.字符型变量的存储

        将字符变量存储到内存中中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII 码放到内存中。因此它的存储形式就与整数的存储形式类似。不同的是,字符型数据占8个bit位,而整形数据占32个bit位,比特位的位数不同也就说明着它们的取值范围不同,如果对字符型数据的赋值超过了所能表示的范围,则数据将会发生截断,导致出错。例如:

我们定义一个字符数据

char c=10;

        由于在计算机中数据是以二进制补码的形式存放,所以我们将整数10转化为二进制补码,然后取前8位放入c中进行存放,对应图解如下:


而如果我们定义了

char c=129 ;

那么其对应的存放图解如下: 

 

我们可以发现,此时c的最终结果并不是129而是-127,说明129超出了字符型变量的表示范围,所以导致数据的存储出现了错误。

3.字符型变量的取值

        在将取值之前,先抛出一句我认为说得很好的一句话:

计算机所谓的特定数据类型能表示多少范围数据,取决于多少比特位的排列组合,比如4个比特位就一定可以表示2^4个数据,计算机绝对不会浪费任何一种组合。

        根据这句话我们就可以先断定,一个字符型变量一定可以表示2^8,也就是256个数据。我们先按照符号位对字符型变量进行如下拆分:

        按照以上分析,那么我们字符型变量的取值范围就是[-127,127]吗,实则不然。细心的小伙伴可能会发现,无论是上面还是下面,都有0这个数据的表示方式,分别为0000 0000和1000 0000;而在计算机中,我们当然不能让0有两种表示方式,否则会引起歧义。因此我们将0000 0000来表示0。而前面我们说过,计算机绝对不会浪费任何一种组合,所以,我们还需对1000 0000进行定义,赋予其意义。

        我们不妨先来猜猜,1000 0000要表示什么呢?由于数据的取值范围肯定是连续的最好,所以我们可以在128和-128进行选取,又由于1000 0000最高位即符号位为1,所以我们猜测1000 0000代表-128。则字符型数据的表示范围就是[-128,127]

4.字符型变量中的-128

        那么,为什么在字符型变量1000 0000代表-128呢?我们依旧来分析一下如下语句:

char c=-128;

        我们知道,当我们定义了一个变量c时,编译器对c分配了8个bit位的内存空间,但是对于-128,它一开始并不是在变量c的内存空间中,是在寄存器中,需要先转化为二进制后,才能放入c中,因此我们可以得到以下图解:

        我们可以发现,十分巧合的是,当-128在寄存器中转化为二进制补码后,截断存入c中时,存放的数据正是1000 0000,也就是我们上述所猜想的那样。 

        那如果我们将此时c中存放的1000 0000取出来,会不会还是-128呢?遗憾的是,由于数据发生的截断,所以无法正确的转化回来。具体过程如下:

显然,最后转化后的原码并不是-128。所以我们可以说在字符型数据中1000 0000表示-128是一种半计算半规定的方式。因此以后我们在字符型变量中看到1000 0000,不必再进行转化,可以将其直接看成-128。

5.取值转换图

        综上,我们可以得出一个8bit位的char类型变量所能表示的范围是[-128,127].如果超出了这个范围,就会发生截断,产生错误。根据以下转换图我们可以轻松得出截断后的数字:

例如以下两个例子

char c=128;

char c=-129;

对于例1,因为128=127+1,根据顺时针方向为正方向,则c最后的值就为127下一个数字-128 。

对于例2,因为-129=-128-1,所以需要取-128负方向也就是逆时针方向的下一个数字,则c最后的值就是127。


 以上,就是本期的全部内容。

制作不易,能否点个赞再走呢qwq

  • 20
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
C语言中的变量包括整、浮点字符和指针等。 整变量用于存储整数,包括有符号和无符号类。有符号类可表示正、负整数,无符号类只能表示非负整数。取值范围主要取决于所使用的编译器和机器平台,通常有char(1字节,范围-128到127或0到255)、short(2字节,范围-32768到32767或0到65535)、int(4字节,范围-2147483648到2147483647或0到4294967295)、long(4或8字节,范围因平台而异)、long long(8字节,范围因平台而异)等。 浮点变量用于存储实数,包括单精度和双精度类。单精度浮点数通常为4字节,双精度浮点数通常为8字节。取值范围也因平台不同而有所差异,但一般单精度范围约为1.2e-38到3.4e38,双精度范围约为2.3e-308到1.7e308。 字符变量用于存储单个字符,占用1字节。字符可表示ASCII字符取值范围为0到127,或者使用wchar_t类表示更广泛的字符集。 指针变量用于存储内存地址,用于访问和操作其他变量。指针的大小根据所在平台而定,一般为4或8字节。指针的取值范围可能占用整个地址空间,但具体大小取决于计算机的架构和操作系统。 总结而言,C语言变量的类取值范围因平台和编译器而异,但通常整、浮点字符和指针是基本的类,其取值范围由不同数据类和计算机架构决定。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

忆梦初心

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值