(1)short

C语言中,short是定义一种整型变量家族的一种

长度:

依据程序编译器的不同short定义的字节数不同。

标准定义short短整型变量不得低于16位,即两个字节。

编译器头文件夹里面的limits.h定义了short能表示的大小:SHRT_MIN~SHRT_MAX。在32位平台下如windows(32位)中short一般为16位。

若规定编译器规定short为2字节,则:

unsigned short i; i可以表示0~65535(0~2^16-1)

signed(默认)short i; i可以表示-32768~+32767(-2^(16-1)~2^(16-1)-1)

(2)int

C语言中,int是定义一种整型变量家族的一种。

长度:

目前在一般的电脑中,int占用4字节,32比特,数据范围为-2147483648~2147483647[-2^31~2^31-1]

在之前的微型机中,int占用2字节,16比特,数据范围为-32768~32767[-2^15~2^15-1]

unsigned int 表示无符号整数,数据范围为[0~2^32-1]

除了short、int类型之外,还有long、long long类型可以表示整数。

以下对范围求取进行说明。

图1

以8位进行说明,16位,32位,64位类似。

第一位为符号位,0正,1负。假定数据类型的长度为一个字节8位。对有符号整型进行说明。

(1)有符号

对于负数的下限,最高位作为符号位位1,用1 1 1 1 1 1 1 1,如图1所示。即为-127,而不是-128,

难道是1 0 0 0 0 0 0 0?其实就是用1 0 0 0 0 0 0 0表示-128的。以下进行说明。

注意:1000 0000 B 不等于0 而是 -128(图2)

+127 +1 = -128

即 0111 1111 B+1 = 1000 0000 B

也就是发生了 byte值溢出

8位二进制反码的表示范围:-127~+127

为什么 -128 的二进制会是1000 0000;

1000 0000 (原) = 1111 1111(反)

那么问题来了: 64+32+16+8+4+2+1 = 127 为什么会有128呢?

原来 负数 反码是需要补码的,也就是在最后得出的结果上 +1

注意:计算机中只有 +0 而不存在 -0的说法,因为-0是完全没有意义的存在(见下对正0负0的说明),

即:只有 0000 0000 = +0

而没有 1000 0000 = -0

1000 0000的真实身份是 -128

图2

需要了解计算机对数据的存储表示方法(原码、反码、补码),以及负0与正零的表示。

(1)所谓原码就是前面所介绍的二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

反码表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

补码表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

原码不能直接参加运算,可能会出错。例如数学上,1+(-1)=0,而在二进制中00000001+10000001=10000010,换算成十进制为-2。显然出错了。所以原码的符号位不能直接参与运算,必须和其他位分开,这就增加了硬件的开销和复杂性。为了解决原码做减法的问题,出现了反码:计算十进制的表达式: 1-1=01 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原=[0000 0001]反 + [1111 1110]反 =[1111 1111]反 = [1000 0000]原 =-0    发现用反码计算减法,  结果的真值部分是正确的. 。而唯一的问题其实就出现在"0"这个特殊的数值上.虽然人们理解上+0和-0是一样的。但是0带符号是没有任何意义的.而且会有[0000 0000]原和[10000000]原两个编码表示0.于是补码的出现,

反码是数值存储的一种,多应用于系统环境设置,如linux平台的目录和文件的默认权限的设置umask,就是使用反码原理。

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。负数的补码则是符号位为“1”。并且,这个“1”既是符号位,也是数值位。数值部分按位取反后再在末位(最低位)加1。也就是“反码+1”。

补码的出现,解决了0的符号以及两个编码的问题:1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 =[0000 0001]补 + [1111 1111]补 =[0000 0000]补=[0000 0000]原  ,这样0用[0000 0000]表示,而以前出现问题的-0则不存在了.而且可以用[10000000]表示-128:(-1) + (-127) = [1000 0001]原 + [1111 1111]原 =[1111 1111]补 + [1000 0001]补 =[1000 0000]补

-1-127的结果应该是-128,在用补码运算的结果中, [1000 0000]补 就是-128.但是注意因为实际上是使用以前的-0的补码来表示-128,所以-128并没有原码和反码表示.(对-128的补码表示[10000000]补算出来的原码是[0000 0000]原,这是不正确的)使用补码,不仅仅修复了0的符号以及存在两个编码的问题,而且还能够多表示一个最低数.

这就是为什么8位二进制,使用原码或反码表示的范围为[-127, +127],而使用补码表示的范围为[-128, 127].因为机器使用补码,所以对于编程中常用到的32位int类型,可以表示范围是: [-2^31, 2^31-1]因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值.

(2)根据原码的定义:正零和负零的原码为:

+0 : 0000 0000 0000 0000 0000 0000 0000 0000 (32 bit)

-0 : 1000 0000 0000 0000 0000 0000 0000 0000

而反码为:

+0 : 0000 0000 0000 0000 0000 0000 0000 0000

-0 : 1111 1111 1111 1111 1111 1111 1111 1111

补码为:

+0 : 0000 0000 0000 0000 0000 0000 0000 0000

-0 : 1 0000 0000 0000 0000 0000 0000 0000 0000

可以看出,-0的补码发生溢出,舍弃最高位后,其跟+0在内存的表示一样,都是:

0000 0000 0000 0000 0000 0000 0000 0000

再看看下面的图中所示错误。这个错误牵扯到一个叫模的概念。下面是解释。

1)模的概念:把一个计量单位称之为模或模数。例如,时钟是以12进制进行计数循环的,即以12为模。在时钟上,时针加上(正拨)12的整数位或减去(反拨)12的整数位,时针的位置不变。14点钟在舍去模12后,成为(下午)2点钟(14=14-12=2)。从0点出发逆时针拨10格即减去10小时,也可看成从0点出发顺时针拨2格(加上2小时),即2点(0-10=-10=-10+12=2)。因此,在模12的前提下,-10可映射为+2。由此可见,对于一个模数为12的循环系统来说,加2和减10的效果是一样的;因此,在以12为模的系统中,凡是减10的运算都可以用加2来代替,这就把减法问题转化成加法问题了(注:计算机的硬件结构中只有加法器,所以大部分的运算都必须最终转换为加法)。10和2对模12而言互为补数。

同理,计算机的运算部件与寄存器都有一定字长的限制(假设字长为8),因此它的运算也是一种模运算。当计数器计满8位也就是256个数后会产生溢出,又从头开始计数。产生溢出的量就是计数器的模,显然,8位二进制数,它的模数为2^8=256。在计算中,两个互补的数称为“补码”。

图3中 的错误解释:由于usigned long最大取值范围为2^32-1,而%d是以有符号整数进行输出,故进行了数值转换,即转为signed int,对于signed int 取值范围最大值小于usigned long,发生溢出,根据上述对模概念的说明,应该明白为什么输出是-2了。

图3

图4、图5为用基于X64处理器的gcc编译器输出各整型数据类型长度的结果

图4

图5

c语言规定整型变量长度,搞透C语言整型数据范围表示相关推荐

  1. c语言规定整型变量长度,C语言整型变量所占内存字节数

    C标准没有具体规定各类整型数据所占内存字节数,只要求long型数据长度不短于int型,short型不长于int型.具体如何实现,由各计算机系统自行决定.如在微机上,int型和short都是16位,而l ...

  2. char类型怎么输入 c语言_还没搞懂C语言指针?这里有最详细的纯干货讲解(附代码)...

    21ic综合自网络信息 指针对于C来说太重要.然而,想要全面理解指针,除了要对C语言有熟练的掌握外,还要有计算机硬件以及操作系统等方方面面的基本知识.所以本文尽可能的通过一篇文章完全讲解指针. 为什么 ...

  3. c语言设整型变量xyz为5,C语言程序设计教程清华大学出版社陈明主编第5章答案.doc...

    C语言程序设计教程清华大学出版社陈明主编第5章答案 第5章 习题解答 一.选择题 1.以下叙述中错误的是 . A)对于double类型数组,不可以直接用数组名对数组进行整体输入或输出 B)数组名代表的 ...

  4. 【C语言】一文搞懂C语言文件操作

    文章目录 0. 前言 1. 为什么使用文件? 2. 什么是文件 2.1 程序文件 2.2 数据文件 2.3 文件名 3. 文件的打开和关闭 3.1 文件信息区 3.2 文件指针 3.3 文件的打开和关 ...

  5. c语言表示整型变量,在表示 C语言的整型变量时,表示“无符号长整型”的符号是( )。...

    [判断题]做个优秀的团队成员,具备高超的团队合作能力,提升团队合作效率,是每一个职场人都应该具备的职业素质. [判断题]1. 我国现行农村土地制度的根本创新之一是家庭承包制( ) [多选题]_____ ...

  6. 【零基础搞定C语言——导航汇总篇】

    声明:C语言初阶和进阶全部笔记已更新结束,初阶部分适合零基础同学阅读,进阶部分是建立在初阶基础之上的深入.由于作者水平有限,本文难免有错误和不准确之处,本人也很想知道这些错误,恳望读者批评指正,大家一 ...

  7. c语言键盘输入屏幕输出ppt,c语言健盘输入与屏幕输出.ppt

    本章学习内容, 字符输出函数putchar()  字符输入函数getchar()  数据的格式化输出函数printf()  数据的格式化输入函数scanf(),第4章 键盘输入 和屏幕输出,4 ...

  8. C语言指针超全面透析(原来你一直没有搞懂C语言指针是因为没有理解其中的规律)

    文章目录 写在前面 一.思考指针的基础 1.指针的实质 2.指针的层次 3.指针的分类 4.两个符号(&和*) 二.单指针(int *p) 三.指针数组(int *p[10]) 四.行指针(i ...

  9. c语言不定长数组_学习C语言这三块“硬骨头”不搞定学了也是白学

    C语: C语言在嵌入式学习中是必备的知识,审核大部分操作都要围绕C语言进行,而其中有三块"难啃的硬骨头"几乎是公认级别的. 01指针 C语言 指针公认最难理解的概念,也是让很多初学 ...

最新文章

  1. 麻省理工正式宣布人工智能独立设系!人工智能与电子工程、计算机科学系将三分天下...
  2. k8s 关键字以及管理流程。
  3. It is possible that this issue is resolved by uninstalling an existi
  4. 【详解!思路清晰】1095 解码PAT准考证 (25分)
  5. 隐藏界面没有必要应用场景
  6. javafx 自定义控件_JavaFX自定义控件– Nest Thermostat第3部分
  7. dmz区服务器系统激活,dmz主机搭建服务器
  8. SERVER的蓝屏信息速查表--THREE
  9. 查看磁盘I/O操作信息
  10. 请检查 mysql 模块是否正确加载_mysql_connect() 不支持 请检查 mysql 模块是否正确加载...
  11. 忍不住笑的笑话(last:20180419)
  12. c语言做线性代数第六版答案,编程与线性代数
  13. Java打包JRE于exe中方法
  14. 美股市场:暴风雨前的宁静
  15. ps 学习布尔运算运用方法
  16. android如何实现环形缓冲区
  17. Linux CP文件夹略过目录的解决方法
  18. 使用GridView使用类似电影海报宣传页面
  19. 金山打字专业文章计算机,计算机打字训练管理(范文).doc
  20. 计算机考研854题型,2020哈尔滨工业大学计算机考研854真题回忆版

热门文章

  1. Druid简介及常用查询操作
  2. 触发器flip-flop
  3. 干货 | 软件工程师必知之事 —— 如何定义自己的职业路线?
  4. Java每日一练(4)
  5. centos 系统软件包管理 yum 本地yum配置 扩展源epel rpm 清除yum缓存 yum provides */vim 第十节课...
  6. cPanel创建数据库教程
  7. 第4季2:并口、MIPI、LVDS的简介
  8. 图片压缩怎么在线处理?如何压缩图片大小kb?
  9. 计算机病毒生命开始周期,计算机病毒是人工生命第一个案例吗?
  10. 《落地,请开手机》里面最经典的一句台词