关于C语言中有符号的整数值范围为什么是从-32768~32767以及有符号和无符号区别
一、关于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
关于C语言中有符号的整数值范围为什么是从-32768~32767以及有符号和无符号区别相关推荐
- C语言字符付应整数值,全国二级C语言复习资料3.doc
全国二级C语言复习资料3 一.选择题 在下列各题的A).B).C).D)四个选项中,只有一个选项是正确的,请将正确的选项涂写在答题卡相应位置上,答在试卷上不得分. (11)以下不正确的叙述是 A)在C ...
- c语言double可以代表整型么,C语言中整型变量(int)实型变量(float)双精度变量(double)到底是什么东西?有什么区...
整型[signed]int -2147483648~+2147483648 无符号整型unsigned[int] 0~4294967295 短整型 short [int] -32768~32768 无 ...
- 【C语言位运算的应用】如何按bit位翻转一个无符号整型
其实现思路如下: 将目标数值进行末尾比特位摘取,将所摘取的bit位放到一个相同类型的末尾,目标数值bit位右移,相同类型bit位左移. C语言的位运算符: 实现代码如下: #include & ...
- 【c语言学习课堂笔记第三天】:int函数有符号整型和无符号整型
int 函数 有符号整型: 概念:截图 sizeof函数可查看字节数量 声明变量技巧: 随堂笔记: #include <stdio.h> #include <stdlib.h> ...
- C语言--无符号整型
今天在做一道题的时候,出现了无符号整型的概念,,之前由于没遇到,所以没有彻底理解无符号整形的意思,百度了很多都只讲了无符号整型和有符号整型的区别,没有怎么讲到无符号是怎么计算的,今天就来讲讲无符号整形 ...
- 关于C++中有符号整型和无符号整型的转换方法
首先举个c++代码,如下: #include <iostream> using namespace std;/* * 这个程序演示了有符号整数和无符号整数之间的差别 */ int main ...
- c语言无符号字符型5是什么,C语言中无符号型别是什么意思啊?
C语言中无符号型别是什么意思啊?以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! C语言中无符号型别是什么意思啊? 无符号 ...
- c语言之无符号/有符号数加减法运算
c语言之无符号/有符号数加减法运算 转自:http://www.360doc.com/content/12/1129/15/1317564_250977880.shtml 1.加减运算指令是不区分有符 ...
- c++基本数据类型基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:
基本类型: 整型: 短整型: short int 整型: int 长整型:long int 字符型:char(分为有符号和无符号,默认有符号) 浮点型:单精度型:float 双精度型:double 长 ...
- C语言之(有关%d和%u的有关内容,输出方法)(有符号和无符号在内存中的存储情况)(整形无符号数和有符号数是如何进行计算的,整形无符号数和有符号数在循环中的应用举例)
在C语言的课本中,我们常见的是%u,但我们平时在写代码常用的确是%d,它们二者之间有什么区别呢? 表示形式上 %u表示输入输出格式说明符,是按照unsigned int(无符号十进制数据)格式输入或输 ...
最新文章
- DataTables 表格固定栏使用方法
- python工作招聘-爬了招聘网站之后,给你几点学习Python的建议
- 微型计算机使用键盘上的alt键称为,微型计算机使用的键盘上的Alt键称为_____。...
- editplus 快捷键
- 排序算法之两路归并排序(Java)
- linux磁盘管fdisk,Linux 磁盘分区工具和挂载,fdisk管理分区详解
- 金九银十!2021阿里+头条+腾讯等大厂Java笔试题分享
- SQL Server 字符串拆分
- 10分钟学会写一个简单的Mysql存储过程
- 神策分析 iOS SDK 全埋点解析之启动与退出 | 数据采集
- WS2812B 5050数据整理
- 2016/2/19:ApplePay
- cannot retry due to redirection, in streaming mode
- java.net.ConnectException no available server
- Leetcode刷题学习记录
- verilog简单奇校验
- 老生常谈之防止刷新重复提交表单。
- 有没有计算机网课,有没有电脑录制视频工具可以录制网课?
- Maxent模型预测
- webapi框架搭建-创建项目(三)-webapi owin
热门文章
- win10服务器系统要设置要密码是什么,云服务器win10系统初始密码
- 计算机的外围设备找不到,bluetooth外围设备,教您bluetooth外围设备找不到驱动程序怎么解决...
- Qt中qmake的INSTALLS变量将编译文件拷到运行目录
- 计算机按电源键无法反应,电脑无法开机怎么办 按电脑开机键也没反应的原因及处理解决办法...
- Qt中出现 exited with code 3错误的其中之一原因
- 一起学爬虫(Python) — 21 蝉妈妈,嘿嘿
- Allegro-Flash焊盘
- latex常见实用网址链接
- 一些实用网址 ubuntu截图+屏蔽一些网址+windows7+ubuntu双系统+泰语打字练习
- 简述窄带与宽带信号的区别