计算char,short,int,long类型变量的取值范围

     源自《The C Programming Language》P28 pr2-1:

     编写一个程序以确定分别由signed及unsigned限定的char,short,int,long类型变量的取值范围。

     参考代码:

     

ContractedBlock.gifExpandedBlockStart.gifmain.c
1 #include <stdio.h>
2 #include <limits.h>
3 #include <float.h>
4
5 int main()
6 {
7
8 printf("the range of char: %d ~ %d\n", SCHAR_MIN, SCHAR_MAX);
9 printf("the min of char: %d\n", -(char)((unsigned char)~0 >> 1));
10
11 return 0;
12 }

     分析:

      1,  <limits.h>包含了定义char int short long类型取值的最大值和最小值用常量表示(例如SCHAR_MIN = -128)

            所以直接打印即可。

      2,  如果要自己计算的话,则需要用到按位运算符~,>>,对于-(char)((unsigned char)~0 >> 1)解释:

           a: (unsigned char)~0用二进制表示为:11111111

           b: (unsigned char)~0 >> 1,将(unsigned char)~0逻辑右移1位,结果为:01111111

           c: (char)((unsigned char)~0 >> 1),将((unsigned char)~0 >> 1)由无符号类型强制转换为有符号类型

           d: -(char)((unsigned char)~0 >> 1),得到的二进制结果为11111111,最高位为符号为,对应的十进制

                  数为:-127

      3,  Q:为什么SCHAR_MIN = -128,而自己通过计算得到的char型变量的最小值为-127呢?

           A:绝大部分机器采用补码方式表示有符号整数,

                [-1]补码 = 11111111 ?

                -1 取绝对值 1

                  1 原码 00000001

                  1 反码 11111110

                  反码+1 11111111

                  符号位置为1 11111111 <-- -1的补码

               依次类推,[-2]补码 = 11111110 [-3]补码 = 11111101 ... [-128]补码 = 10000000,

               故char型最小值为-128。

               而自己通过计算得到的-127仅仅是将127取负作为最小值,其实在机器中它应该是倒数第二小值。

转载于:https://www.cnblogs.com/roma823/archive/2011/04/27/2101251.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/422867.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

EtherCAT主站实时性分析

转载自&#xff1a;https://blog.csdn.net/ethercat_i7/article/details/54018036 一、实时性的意义 在主从DC同步模式下&#xff0c;主站需要以非常精准的时间发送过程数据&#xff0c;如下图所示&#xff1a; 二、实时性的关键 如下图所示&#xff0c;影响实时性的关键因素是…

VNC源码研究(一)

VNC采用RFB通信协议。RFB ("remote 帧缓存 ") 是一个远程图形用户的简单协议&#xff0c;因为它工作在帧缓存级别上&#xff0c;所以它可以应用于所有的窗口系统&#xff0c;例如&#xff1a;X 11,Windows 和 Mac 系统。 独特的计算环境。 RFB 协议可进行可靠的传输…

枚举的一些常用操作

本章将介绍以下几点&#xff1a; 1、如何把其它类型转换为枚举类型&#xff1f; 2、如何把枚举中的值添加到下拉菜单中&#xff1f; 一、如何把其它类型转换为枚举类型&#xff1f; 我们回顾一下有关字符串与数字之间的转换&#xff0c;如&#xff1a; string strValue&quo…

10个开源免费的电子商务平台(转自伯乐在线)

如今&#xff0c;人们几乎可以在网络上购买到绝大部分东西&#xff0c;从电子产品、衣服&#xff0c;到机票预订和订餐。购物已转移到互联网&#xff0c;你所做的&#xff0c;只是需要付钱。当然&#xff0c;消费者会 非常注重网站的用户体验。所以&#xff0c;一个整洁安全的平…

【Git、GitHub、GitLab】五 git中裸仓库.git下的内容

上一篇文章学习了git的文件重命名与git -log 的系列命令的使用方法。点击链接查看上一篇文章&#xff1a;【Git、GitHub、GitLab】四 Git文件重命名的简单方法以及使用git log查看版本演变历史 本篇文章学习git中&#xff0c;在没有远端服务器的情况下&#xff0c;裸仓库.git中…

【Git、GitHub、GitLab】六 GIT中commit、tree和blob三个对象之间的关系

上一篇文章学习了git裸仓库.git中的内容&#xff0c;点击查看上一篇文章&#xff1a;【Git、GitHub、GitLab】五 git中裸仓库.git下的内容 本篇文章记录学习git中commit、tree和blob三个对象之间的关系。 首先需要会使用下面的命令&#xff1a; cat 命令&#xff0c; 功能&am…

【Git、GitHub、GitLab】十 将git仓库备份到本地

上一篇文章学习记录了工作中常用的一些git命令&#xff0c;点击链接查看&#xff1a;【Git、GitHub、GitLab】九 工作中非常重要的一些git用法 文章目录1 git的传输协议2 如何将git仓库备份到本地2.1 使用哑协议备份2.2 使用智能协议备份1 git的传输协议 哑协议与智能协议的区别…

java-XML

XML不再多说&#xff0c;XML 约束也不用说了&#xff0c;这里讲讲java如何对XML操作。 java中使用XML&#xff0c;目前常用的就是Jaxp(sun)和dom4j了&#xff0c;这里先讲讲java自带的Jaxp包 JAXP 开发包是J2SE的一部分&#xff0c;它由javax.xml、org.w3c.dom 、org.xml.sax 包…

【C语言进阶深度学习记录】一 数据类型的本质与变量的本质

今天学习C语言中的数据类型的本质与变量的本质 文章目录1 什么是数据类型2 变量的本质3 数据类型与变量的关系4 自定义数据类型与创建变量5 总结1 什么是数据类型 数据类型可以理解为固定内存大小的别名数据类型是创建变量的模子 如同下面的图示&#xff0c;各个数据类型是代…

使用第三方Markdown编辑器编辑为知笔记

前言 为知笔记默认的编辑器并没有预览功能&#xff0c;而提供的MD编辑器插件也并不是很好用&#xff0c;但为知笔记提供了可以使用第三方编辑器的功能&#xff0c;Typora编辑器是目前最优秀的Markdown编辑器之一&#xff0c;可以很好作为第三方编辑器。 Typora介绍 Typora是…

【C语言进阶深度学习记录】二 有符号与无符号

今天学习C语言中的有符号与无符号 文章目录1 计算机中的符号位1.1 有符号数的表示法1.2 无符号数的表示法1.3 signed 和 unsigned2 实验-当有符号数与无符号数进行运算3 错误的使用了unsigned4 总结1 计算机中的符号位 C语言中&#xff0c;数据类型的最高位&#xff0c;用于标…

【C语言进阶深度学习记录】三 浮点数(float) 在内存中的表示方法

相信大多数人知道整形数在内存中的分布方式&#xff0c;而且也能很容易写出其二进制的形式&#xff0c;但是对于浮点数&#xff0c;估计知道的人并不是很多今天学习在C语言中浮点数在内存中的表示方法 文章目录1 浮点数在内存中的存储方式1.1 浮点数的转换步骤1.2 浮点数的转换…

【C语言进阶深度学习记录】四 C语言中的类型转换

今天学习C语言中的类型转换&#xff0c;包括隐式类型转换和显示类型转换 文章目录1 C语言中的数据类型转换1.1 强制类型转换1.11 强制类型转换代码分析1.&#xff12; 隐式类型转换1.21 隐式类型转换代码分析2 总结1 C语言中的数据类型转换 C语言中&#xff0c;可以进行数据类…

【C语言进阶深度学习记录】五 C语言中变量的属性

上一篇文章学习了C语言中的类型转换&#xff0c;点击链接查看&#xff1a;【C语言进阶深度学习记录】四 C语言中的类型转换. 文章目录1 C语言的变量属性1.1 auto关键字1.2 register关键字1.3 static 关键字1.4 代码案例分析1.5 extern 关键字1.6 代码案例分析2 总结1 C语言的变…

【C语言进阶深度学习记录】六 C语言中的分支语句

文章目录1 if 语句的分析1.1 if 语句中零值比较的注意点2 switch 语句的分析3 if 与switch语句使用代码案例分析4 if语句与switch语句的互换5 总结1 if 语句的分析 if 语句根据条件选择执行语句else 不能独立存在&#xff0c;且总是与距离它最近的if匹配else 语句可以连接其他…

【C语言进阶深度学习记录】七 C语言中的循环语句

文章目录1 循环语句分析1.1 do...while循环1.2 while循环1.3 for循环1.4 三种循环语句使用对比2 break和continue的区别3 总结1 循环语句分析 C语言中的循环语句主要有for循环&#xff0c;while循环和do…while循环。 循环语句的基本工作方式&#xff1a; 通过条件表达式判断…

【C语言进阶深度学习记录】八 C语言中void的分析

文章目录1 void的意义1.1 不存在void变量1.2 C标准1.3 void指针的意义1.4 通过void* 实现memset函数2 总结1 void的意义 void修饰函数的参数和返回值的时候&#xff1a; 如果函数没有返回值应该将其返回值声明为void如果函数没有参数&#xff0c;应该将函数的参数声明为void如…

【C语言进阶深度学习记录】九 C语言中const的详细分析

文章目录1 const的分析2 const本质的分析实验2.1 代码案例分析3 const修饰函数参数和返回值时的情况3.1 代码案例分析4 总结1 const的分析 不管是C语言还是C语言&#xff0c;const都是一个非常重要的关键字。今天这篇文章着重学习记录C语言中的const。C语言中稍有不同。 在C语…

【C语言进阶深度学习记录】十 C语言中:struct的柔性数组和union分析

本文并不讲C语言的基础 文章目录1 空struct的大小2 结构体与柔性数组2.1 柔性数组的使用方法2.2 柔性数组使用代码案例分析3 C语言中的union分析3.1 使用union判断系统大小端4 总结1 空struct的大小 C语言中的struct可以看成是变量的集合 如果一个struct里面什么都没有&#…