关于C语言中有符号的整数值范围为什么是从 您所在的位置:网站首页 符号数据是什么 关于C语言中有符号的整数值范围为什么是从

关于C语言中有符号的整数值范围为什么是从

2024-01-29 19:57| 来源: 网络整理| 查看: 265

一、关于C语言中有符号的整数值范围为什么是从-32768~32767 对于有符号整型,也就是int型,是和编译器的字长有关的,只有在16位编译器上,int类型占2个字节,其表示范围才是-32768~32767; 对于32位和64位编译器,int类型占4字节,表示范围为-2147483648~2147483647。 以16位编译器为例,介绍其原理,对于32位和64位类似。 int为有符号整型数,在16位编译器上占2字节16位。 对于有符号数,计算机中表达时,最高位约定为符号位,当符号位为0时为正数,符号位为1时为负数。 所以真正表达值的部分是剩余的15位,这15位的范围就是二进制的000 0000 0000 0000到111 1111 1111 1111。 转换成十进制也就是0~32767。 所以,正数的表示范围就是1~32767. 其中有一个特殊的值,就是0值,对于符号位1和0的时候,值都是0,用两个形式表示同一个数无疑是浪费的,符号位为1时的全0,就用来表达-32768了,这也是负数表示的范围比正数多1的原因。 综上,对于任意位的,无论是8位,16位,32位甚至64位的整数类型表示范围的计算公式为: 如总位数为n位,那么有符号数的范围为 -2^(n-1) ~ 2^(n-1)-1 无符号数的表示范围为: 0~2^n-1 在这个公式中,^表示乘方,

2^n就是2的n次幂。 ————————————————————————————————— 二、c语言中有符号和无符号数据类型的区别 C语言中提供了很多整数类型(整型),主要区别在于它们取值范围的大小。int代表有符号的整数,也就是说,用int声明的变量可以是正数也可以是负数,也可以是零,但是只能是整数。 比如:int a = 3; int b = 0; int c = -5; 以上这些都是合法的。 int的取值范围因机器而异,一般而言,在较旧的PC上,int值在内存中一般是按2个字节(16位)进行存储的,在较新的PC以及工作站和大型机上,int值在内存中一般是按照4个字节(32位)进行存储的。

C语言中将基本数据类型划分为signed(有符号)和unsigned(无符号)两大类。 例如,初始化变量int a = -3;其实它等价于signed int a = -3;关键字signed在这里可以省略,因为C语言默认就是有符号类型的,如果要定义无符号类型的数(也就是0和正整数)可以这样定义,unsigned int b = 5;

为了说明清楚signed和unsigned的区别,首先需要了解数据在内存中是如何存储的,在计算机中所有的数据都是按照二进制进行存储的(以下假设在字长为2个字节的机器上来表示)。

举个例子来说,unsigned int a = 1; 变量a在内存中就是以00000000 00000001来存储的,用图表的形式表示: 在这里插入图片描述

因为这里是unsigned int,它是无符号整型,所以的它的16位全部用来表示数据。

int b = -1;

这里情况就稍微有点复杂了,注意数字1和-1在内存中的存储是完全不一样的,请看, 在这里插入图片描述

在计算机中,整数是以原码的形式存储的,而负数是以补码的形式存储的,原码大家都知道也就是它对应的二进制码,那什么是补码呢,就是原码的反码加1,反码就是原码的各位取反,例如-1的补码是:

首先1的原码是 00000000 00000001

其次取它的反码是 11111111 11111110

最后在其反码的基础上加上1 11111111 11111111

得到-1的补码是,11111111 11111111 上图中可以看出,int用15位来表示一个数字,第1位被符号位占用了,其实大家应该不难看出在数学中-1是负数中最大的整数,所以这里看到它的各个位都置1,对应于二进制来讲就是最大的数了,计算机就是按照符号位来识别该数是正是负,所以第一位只起到标识的作用并不作为数据位来使用,而其余的15位才是真正的数据位。以补码的形式来存储有个好处那就是计算机将负数的运算当作加法来处理了。那么将一个有符号的数赋给一个无符号的数会发现一个很有趣的现象,比如:

unsigned int a;

int b = -1;

a = b;

printf(“a=%u”,a);

输出a=65535,这个结果是怎么出来的呢?其实很简单,b=-1,根据上图-1在计算机中的数据位是1111111 11111111,注意是数据位,是要去掉符号位的, 所以是15 ,a是无符号类型的整数,将b赋给a,自然a就是1111111 11111111,也是15位第一位补0,转换成十进制就是65535, 它也是unsigned int范围的最大上限(0~65535 216-1),-1是最大的负整数转换成正整数当然也是最大了,这个应该很好理解了。 例如: unsigned int 类型的范围:一般较旧的机器占两个字节。最大是0—65535,16位2进制数; signed int 类型的范围:有符号也是16位2进制,只不过第一位用来表示符号了,所以有符号的范围是-32768—32767. ————————————————————————————————— -2的原码为10000010,反码就是符号位不变,其余各位取反,所以反码为11111101,补码就是反码在最末位加1,结果为11111110。

原文链接:https://blog.csdn.net/gogokongyin/article/details/39758289



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有