之前在网上看到的一个讨论,是谁决定了数据类型的范围?

比如说,怎么确定 char 就是  -128~127 ,而不是 -127~128 呢?

说下规定

signed 的取值范围是 -(2N-1) to 2N-1 - 1

unsigned 的取值范围是 0 to (2N-1) + (2N-1 - 1)

只要记住一点就好了,就是最小值,有符号的最小值是 -128 开始,因为0占用了一个位置,所以最大值就只能是127。

无符号的最小值是 0 ,那最大值就是255了。

#怎么计算呢?

如果我们知道 #include<limits.h> 这个头文件后,可能就很容易了,因为最大值最小值都在这里面有宏定义。

#看一个老外的代码

#include <stdio.h>
#include <limits.h>
#include <float.h>int main()
{printf("Range of signed char %d to %d\n", SCHAR_MIN, SCHAR_MAX);printf("Range of unsigned char 0 to %d\n\n", UCHAR_MAX);printf("Range of signed short int %d to %d\n", SHRT_MIN, SHRT_MAX);printf("Range of unsigned short int 0 to %d\n\n", USHRT_MAX);printf("Range of signed int %d to %d\n", INT_MIN, INT_MAX);printf("Range of unsigned int 0 to %lu\n\n", UINT_MAX);printf("Range of signed long int %ld to %ld\n", LONG_MIN, LONG_MAX);printf("Range of unsigned long int 0 to %lu\n\n", ULONG_MAX);// In some compilers LLONG_MIN, LLONG_MAXprintf("Range of signed long long int %lld to %lld\n", LONG_LONG_MIN, LONG_LONG_MAX); // In some compilers ULLONG_MAXprintf("Range of unsigned long long int 0 to %llu\n\n", ULONG_LONG_MAX); printf("Range of float %e to %e\n", FLT_MIN, FLT_MAX);printf("Range of double %e to %e\n", DBL_MIN, DBL_MAX);printf("Range of long double %e to %e\n", LDBL_MIN, LDBL_MAX);return 0;
}

#输出

Range of signed char -128 to 127
Range of unsigned char 0 to 255Range of signed short int -32768 to 32767
Range of unsigned short int 0 to 65535Range of signed int -2147483648 to 2147483647
Range of unsigned int 0 to 4294967295Range of signed long int -2147483648 to 2147483647
Range of unsigned long int 0 to 4294967295Range of signed long long int -9223372036854775808 to 9223372036854775807
Range of unsigned long long int 0 to 18446744073709551615Range of float 1.175494e-038 to 3.402823e+038
Range of double 2.225074e-308 to 1.797693e+308
Range of long double -0.000000e+000 to -1.#QNAN0e+000--------------------------------

#尴尬了

要是我记不住那个头文件,或者是我记不住那些宏,那要怎么搞呢?所以就有了下面的代码

#include "string.h"
#include "stdio.h"int main()
{printf("Range signed char %lld to %lld\n",-(1LL << (8*sizeof(char) -1)),(1LL << (8*sizeof(char) -1)) - 1);printf("Range unsigned char 0 to %lld\n",(1LL << (8*sizeof(char) -1)) + (1LL << (8*sizeof(char) -1)) - 1);printf("Range signed int %lld to %lld\n",-(1LL << (8*sizeof(int) -1)),(1LL << (8*sizeof(int) -1)) - 1);printf("Range unsigned int 0 to %lld\n",(1LL << (8*sizeof(int) -1)) + (1LL << (8*sizeof(int) -1)) - 1);printf("Range signed long %lld to %lld\n",-(1LL << (8*sizeof(long) -1)),(1LL << (8*sizeof(long) -1)) - 1);printf("Range unsigned long 0 to %lld\n",(1LL << (8*sizeof(long) -1)) + (1LL << (8*sizeof(long) -1)) - 1);printf("Range signed long long %lld to %lld\n",-(1LL << (8*sizeof(long long) -1)),(1LL << (8*sizeof(long long) -1)) - 1);printf("Range unsigned long long 0 to %llu\n",(1LL << (8*sizeof(long long) -1)) + (1LL << (8*sizeof(long long) -1)) - 1);}

#输出

Range signed char -128 to 127
Range unsigned char 0 to 255
Range signed int -2147483648 to 2147483647
Range unsigned int 0 to 4294967295
Range signed long -2147483648 to 2147483647
Range unsigned long 0 to 4294967295
Range signed long long -9223372036854775808 to 9223372036854775807
Range unsigned long long 0 to 18446744073709551615--------------------------------
Process exited after 0.03036 seconds with return value 51

如果对上面的不是很理解的话,可以看看我这个图片

方便理解的图片

#还有一种写法

这里使用了库函数pow,但是这个函数返回值是double,这里需要特别注意一下。

#include "stdio.h"
#include "math.h"int main()
{printf("signed char %ld to %ld\n",(int)-pow(2,sizeof(char)*8-1),(int)pow(2,sizeof(char)*8-1) -1);printf("unsigned char 0 to %ld\n",(int)pow(2,sizeof(char)*8) -1);printf("signed int %lld to %lld\n",(long long)-pow(2,sizeof(int)*8-1),(long long)pow(2,sizeof(int)*8-1) -1);printf("unsigned int 0 to %lld\n",(long long)pow(2,sizeof(int)*8) - 1);return 0;
}

#输出

signed char -128 to 127
unsigned char 0 to 255
signed int -2147483648 to 2147483647
unsigned int 0 to 4294967295--------------------------------

因为pow的返回值是 double 使用的时候需要特别注意

# 说一下

数值在计算机里面都是用补码的形式存储的,补码和原码是不一样的,特别是负数。

正数的原码、反码、补码都相同

原码: 最高位是符号位,其余为是数值位「8421定律」,最高位是0表示正数,1表示负数。

负数的反码: 在原码的基础上,符号位不变,数值位取反。

负数的补码: 在反码的基础上加 1 。

  推荐阅读:

专辑|Linux文章汇总

专辑|程序人生

专辑|C语言

嵌入式Linux

微信扫描二维码,关注我的公众号 

C语言怎么计算数据类型范围?相关推荐

  1. C语言,计算数据类型及所对应的字节数。

    介绍: sizeof是C语言的一种单目操作符,如C语言的其他操作符++.–等.它并不是函数.sizeof操作符以字节形式给出了其操作数的存储大小.操作数可以是一个表达式或括在括号内的类型名.操作数的存 ...

  2. R语言向量vector数据类型元素索引、访问:使用length函数计算向量的长度、元素个数

    R语言向量vector数据类型元素索引.访问:使用length函数计算向量的长度.元素个数 目录 R语言向量vector数据类型元素索引.访问:使用length函数计算向量的长度.元素个数 R 语言特 ...

  3. c语言程序计算p q真值表,C语言程序设计第2章数据类型﹒运算符和表达式.ppt

    C语言程序设计第2章数据类型﹒运算符和表达式 教学目标 掌握C语言标识符的组成 理解C语言的基本数据类型 掌握变量定义的方法 掌握常用的运算符的使用 掌握混合运算的数据转换方法 2.1 C语言的数据类 ...

  4. python语言的数据类型有哪些_Python语言有哪些数据类型

    在Python中,能够直接处理的数据类型有以下几种: 一.整数 Python可以处理任意大小的整数,当然包括负整数,在Python程序中,整数的表示方法和数学上的写法一模一样,例如:1,100,-80 ...

  5. Go语言基础之数据类型

    Go语言基础之数据类型 Go语言中有丰富的数据类型,除了基本的整型.浮点型.布尔型.字符串外,还有数组.切片.结构体.函数.map.通道(channel)等.Go 语言的基本类型和其他语言大同小异. ...

  6. C 语言编程 — 基本数据类型

    目录 文章目录 目录 前文列表 数据类型 基本数据类型 整型 浮点型 前文列表 <程序编译流程与 GCC 编译器> <C 语言编程 - 基本语法> 数据类型 数据类型,即数据对 ...

  7. C语言如何根据数据类型来处理不同的数据?

    位指的是短小的二进制数字,是一个二进制的赋值变量.一个单一的位只能代表两个值所以我们要把他们组织到一起才能表示更广范围的数字.位的最常组织方式是字节,它是一个八位的位组数列. 将这些位组织到一起后,有 ...

  8. c语言字符型运算符,C语言试题:数据类型、运算符与表达式

    <C语言试题:数据类型.运算符与表达式>由会员分享,可在线阅读,更多相关<C语言试题:数据类型.运算符与表达式(4页珍藏版)>请在人人文库网上搜索. 1.3 数据类型.运算符与 ...

  9. 关于C语言数据类型的PPT,C语言基本的数据类型.ppt

    C语言基本的数据类型.ppt 第3章 基本数据类型(1),本章内容介绍,引出标示符 3.1 C语言的数据类型 3.2 整型和实型 3.3 字符型 3.4 库函数,补充什么是标识符,标识符是一个名字,是 ...

最新文章

  1. [JAVAEE] Thymeleaf 基本语法: 迭代循环
  2. 【Java】剑指 Offer II 022. 链表中环的入口节点
  3. 程序员Web面试之前端框架等知识
  4. C#中通过单例模式以及Dictionary实现键值对的映射,通过key获取value
  5. P6097-[模板]子集卷积
  6. 盘点机器学习领域的五大流派
  7. Python表示不甘心,汤姆大叔送书,Python抢书之毫秒级跟进--获取服务器时间
  8. django 1.8 官方文档翻译: 6-4-2 编写自定义的django-admin命令
  9. 未来感十足:小米发布四曲面屏幕专利
  10. 异步类随机多址接入分析
  11. VB.NET 按键代码 及组合键
  12. MyBatis源码阅读(二) --- 执行流程分析
  13. ASM磁盘配置(udev)
  14. ios开发swift_10位Swift和iOS开发大师
  15. 舒舍提醒你需要注意这些
  16. VUE系列——弹窗代码编写与调用弹窗过程详解
  17. pycharm官方下载库很慢、会失败的解决方法
  18. 多校9 HDU-6164 Dying Light 几何数学
  19. 51单片机入学第八课——8*8点阵屏
  20. 小福利,python内置map函数和lambda函数运用

热门文章

  1. 查询Oracle正在执行的sql语句
  2. 工作的习惯,看到好收藏下
  3. 在NetBeans IDE 6.9.1上搭建Android SDK环境(WIN和Linux平台)
  4. 比tween更有效的tween包.
  5. thinkphp如何增加session的过期时间
  6. 计算机应用基础精品课程申报表,《计算机应用基础》精品课程申报书(修改意见)...
  7. Python 内置模块之 ConfigParser - 解析 ini 文件
  8. namespace! 报错
  9. 机器学习之决策树与随机森林
  10. Android 开源优秀 Library 推荐