《C程序设计语言》 练习2-1
问题描述
编写一个程序以确定分别由signed及unsigned限定的char、short、int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现
Write a program to determine the ranges of char , short , int , and long variables, both signed and unsigned , by printing appropriate values from standard headers and by direct computation. Harder if you compute them: determine the ranges of the various floating-point types.
解题步骤
这里我们只讲解第二种也就是计算的方法,第一种很简单,照着表格抄上打印出来就OK了。
主要思路:unsigned类型就是让二进制的所有位都变成1;
signed类型就是把除了符号位之外的位数全部变成1,再减一后整体取负数。
用第二种方法首先我们要了解几个知识点:
1.二进制补码
2.按位取反符号~
3.位移操作>>
我们先看代码然后解释:
代码如下
#include<stdio.h> int main()
{
//unsigned 类型
printf("unsigned char max:%u\n",(unsigned char)~ );
printf("unsigned int max:%u\n",(unsigned int)~ );
printf("unsigned short max:%u\n",(unsigned short)~ );
printf("unsigned long max:%lu\n",(unsigned long)~ ); //signed 类型
printf("signed char max:%d\n",(char)((unsigned char)~>>));
printf("signed char min:%d\n",-(char)((unsigned char)~>>)-);
printf("signed int max:%d\n",(int)((unsigned int)~>>));
printf("signed int min:%d\n",-(int)((unsigned int)~>>)-);
printf("signed short max:%d\n",(short)((unsigned short)~>>));
printf("signed short min:%d\n",-(short)((unsigned short)~>>)-);
printf("signed long max:%ld\n",(long)((unsigned long)~>>));
printf("signed long min:%ld\n",-(long)((unsigned long)~>>)-);
return ;
}
详细解释
首先,我们看unsigned类型的一个语句:
printf("unsigned char max:%u\n",(unsigned char)~0 );
我们要打印出unsigned char的取值的最大值,我们要了解 unsigned char占1个字节,也就是8位二进制。8位二进制的最大值为11111111,即255(2^8-1=256-1)
用按位取反符号~把0(00000000)转换为11111111,之后再将其强制转换为unsigned char类型就会得到255,即(unsigned char)~0
再看unsigned int,占据4个字节,就是4个8位二进制,最大值为11111111 11111111 11111111 11111111
同理,~0后,强制转换类型(unsigned int)~0
之后,我们看signed类型
printf("signed char max:%d\n",(char)((unsigned char)~0>>1));
signed类型是有符号位的,我们要让符号位之外的数全部变成1就可以了
第一,变为最大值:(unsigned char)~0
第二,右移一位,去除符号位:(unsigned char)~0>>1
第三,最大值就是第二位的结果,最小值要在第二步的基础上减一再取负号(后面解释为什么)
为什么最小值还要进一步操作?
我们知道char类型占据一个字节,就是一个8位二进制,其中左边第一位为符号位,其余7为为数值位
2^7=128个数,算上0,所以符号位为0时,是0~127,符号位为1时,是 -127~0,这时候会有两个0,就是出现了“-0”

-128和-0的原码是不一样的;
但是,我们的char类型是8位,它把-128最高位符号位截掉了,这样-128的原码就变成了1000 0000;
被截短的-128的原码才和-0的原码相等;
今后看到一个有符号的char,它的原码用二进制表示为1000 0000的时候,我们就把它当做-128就可以了(只是看做,-128的原码可不是1000 0000)
所以我们在算最小值时,要减一出现-128
《C程序设计语言》 练习2-1的更多相关文章
- 操作系统和程序设计语言的API使用的字符编码分析
1.Java的运行环境中,String是什么编码? 使用java做程序设计语言,字符编码是和jvm相关的,和操作系统无关. java默认的编码是jvm在安装的时候就确定了的,它是根据你的系统的环境确 ...
- python程序设计语言笔记 第一部分 程序设计基础
1.1.1中央处理器(CPU) cpu是计算机的大脑,它从内存中获取指令然后执行这些指令,CPU通常由控制单元和逻辑单元组成. 控制单元用来控制和协调除cpu之外的其他组件的动作. 算数单元用来完成数 ...
- 扩展《C程序设计语言》练习2-3程序通用性
最近开始自学C语言,在看K&R的<C程序设计语言>.练习2-3要求写一个函数,将输入的十六进制数字字符串转换成与之等价的整数值,配套答案没有扩展程序的通用性,所以我就稍微改造改造. ...
- 清风注解-Swift程序设计语言:Point11~15
目录索引 清风注解-Swift程序设计语言 Point 11. 数值型字面量 代码事例: let decimalInteger = // 十进制的17 let binaryInteger = 0b10 ...
- 清风注解-Swift程序设计语言:Point6~10
目录索引 清风注解-Swift程序设计语言 Point 6. 输出常量和变量 代码事例: // 输出的内容会在最后换行 println("hello, world") // 输出的 ...
- 清风注解-Swift程序设计语言:Point1~5
目录索引 清风注解-Swift程序设计语言 Point 1. Swift 风格的"Hello, world" 代码事例: println("Hello, world&qu ...
- 清风注解-Swift程序设计语言
前言 Apple 发布了全新的 Swift 程序设计语言,用来开发 iOS 和 OS X 平台的应用程序.其目的不言而喻:就是为了给老迈的 Objective-C 一个合适接班人!因此,不难预见,未来 ...
- C程序设计语言(第二版)习题:第一章
第一章虽然感觉不像是个习题.但是我还是认真去做,去想,仅此而已! 练习 1-1 Run the "hello, world" program on your system. Exp ...
- Oberon程序设计语言简介
Oberon奥伯龙是一种通用编程语言,也是一种同名操作系统(由Oberon语言开发,且参考过贝尔实验室的新一代网络操作系统Plan9),是由原Pascal程序设计语言的发明者Niklaus Wirth ...
- awk程序设计语言之-awk基础
awk程序设计语言之-awk基础 http://man.linuxde.net/ 常用工具命令之awk命令 awk是一种编程语言,用于在Linux/Unix下对文本和数据处理.数据可以来自标准输入(s ...
随机推荐
- Win8.1/Win10在某些程序输入中文变成问号的解决方法
之前我是使用Win8.1,在某些软件上输入中文,却显示问号,换输入法也没用,当时也没用太在意,后来升级到Win10还是一样.同样的软件在其它Win8.1/Win10电脑却可以正常显示中文. 解决方法如 ...
- 常用Linux命令的基本使用
01.常用Linux命令的基本使用 序号 命令 对应英文 作用 01 ls list 查看当前文件夹下的内容 02 pwd print work directory 查看当前所在文件夹 03 cd [ ...
- 利用浏览器的console篡改cookie
背景: 最近公司有个客户问题,是由于浏览器的cookie中多记录过期的session id导致重复登录,普通操作无法复现,因此尝试进行cookie篡改复现问题. 方法: 首先,要知道软件定义的sess ...
- C - League of Leesins
乱搞一发,,竟然过了!!! 题目大意:输入一个整数n,然后n-2行,每一行3个数字,表示一个数组中连续的3个数字,然后将这3个数字的顺序打乱,然后再将这个n-2行打乱,要求还原数组. 题解:先找到前3 ...
- Java日期时间API系列30-----Jdk8中java.time包中的新的日期时间API类,减少时间精度方法性能比较和使用。
实际使用中,经常需要使用不同精确度的Date,比如保留到天 2020-04-23 00:00:00,保留到小时,保留到分钟,保留到秒等,常见的方法是通过格式化到指定精确度(比如:yyyy-MM-dd) ...
- linq详细案例
LINQ to SQL语句(1)之Where 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句.Where操 ...
- JDBC 进阶:使用封装通用DML DQL 和结构分层以及at com.mysql.jdbc.PreparedStatement.setTimestamp空指针异常解决
准备: 数据表 CREATE TABLE `t_user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(10) DEFAULT ...
- 理解RESTful API
近日妹子向我求助RESTful API到底是个什么东西.原因是她们公司一个新启动的项目因为RESTful API起了争执.服务端同学坚持要用RESTful API,而前端同学则认为服务端用RESTfu ...
- 关于go的通信通道channel——chan的一些问题
go版本 1.8 chan类型的声明,有以下几种: var c chan int c := make(chan int) //slice.map.chan都可以通过用make来初始化,其中map.ch ...
- python 字符与数字如何转换
python中字符与数字相互转换用chr()即可. python中的字符数字之间的转换函数 int(x [,base ]) 将x转换为一个整 ...