回首c语言:了解char的取值范围及数据越界问题

近来一直在学习python之类的高级语言,前几天被一个学弟问了C语言中关于char的一系列问题

结果一时回答不上来,毕竟很久没有复习最基础但是也是最讲究是C语言了,遂抽出不分时间开始温习C语言数据类型,经过研究得出下列结论。

首先放出问题:

1.char的取值范围是多少,为什么是这样。

2.如何用程序数出int类型的最大数字。

在看接下来的答总结的时候,也先请大家仔细思考一下,题目看似简单,实则需要结合原码,反码和补码问题才能解决。

首先明确一点:

无论是char short int float还是double,他们存储数字的方式都是将原数以补码的形式放入到内存中的,他们的补码最左边的一位都是用来表示正负的:1表示负数,0表示正数。

char在C语言中是占用1个字节的,一个字节是8bit,也就是8位,

当我们用char表示”1“这个数字的时候,其补码形式就是 0000 0001。

先看char可以表示的最大正整数

char能表示的最大的正整字就是0111 1111,这个二进制数转化为十进制就是:

这里由等比数列前N相和公式可以算出来正整数最大表示的是2^7-1=127

所以,正整数最高为127,则负整数最小就是-127吗?由此乐意确定char的表达范围是-127——0——127了吗?

答案是不,接下来看:

我们这里看一个比较特殊的数字:-0

它可以用原码1000 0000来表示,

咱们把1000 0000转为补码看看,

1000 0000取反为1111 1111,

再加1可得1 0000 0000;

由于溢出(超过了char的8位数)所以-0的补码就是0000 0000

我们再来看看-128,

-128的原码可以写成1 1000 0000,

我们来对其运算补码,

取反1 0111 1111再+1可以得到1 1000 0000

由于溢出了(超过了char的8位数),我们去掉第九位那么-128的补码就是1000 0000

-128的补码和-0的原码是相等的

所以这里我们就可以直接把-128看作-0。

 

这里可以明确的是:

-0的原码和-128的补码在char的情况下是相等的

所以我们说

Char的范围是-128——127

实际上char的范围是-127——-0和0——127之间,但是-128的补码和-0的原码在char的情况下由于溢出就可以看成-0=-128

圆圈理论的引入

我们可以将char的取值范围可以看成是一个圆形,如下图:

当127+1的时候,就等于-128了,我们看代码:

这里你可能会有一个疑问:如果这样写呢?

原因很简单,因为这个地方%d是整形,最大可以表示的数字是2的31次方-1;

当a+2放到这里以后就会被自动看成unsigned形式,其运算将结果远远小于%d可以表达的最大数字,所以可以照常输出。

那么我们利用圆圈理论,怎样数出int的最大值呢

代码如下:

 

 具体的思想我也用圆圈理论表示出来

 

原文地址:https://www.cnblogs.com/oldfish123/p/12498112.html