C语言怎么计算数据类型范围?

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

比如说,怎么确定 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

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

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

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

相关文章

双十一为何规则复杂,套路多多

为啥不直接打5折?为了让你把“穷人”俩字写到自己脸上啊。 双十一快到了&#xff0c;今年我又一次有了不太想参加的感觉。作为一个阅读理解不太灵光的人&#xff0c;去年的活动我就整得不太明白——优惠券都是十块十块的&#xff0c;也不知道该咋用;还有预付款、整点秒杀之类的…

出去转了一圈

以前一直不知道市场啊&#xff0c;销售啊什么的到底是怎么回事&#xff0c;今天下午跟着公司的市场总监出去转了一圈&#xff0c;算是有了点感谢认识。现在&#xff0c;伴着柔柔的jazz&#xff0c;写点东西。今下午的风很大&#xff0c;温度也很底&#xff0c;应该说是我来北京…

c语言程序设计顺序结构题目,C语言编程 顺序结构编程练习题目

C语言顺序结构编程练习题目C语言编程 顺序结构题目题目1计算摄氏温度 输入一个华氏温度&#xff0c;要求输出摄氏温度。公式为&#xff1a;C5/9(F-32)&#xff0c;输出要有文字说明&#xff0c;取2位小数。式中&#xff1a;C表示摄氏温度&#xff0c;F表示华氏温度题目2 一辆汽…

团建是什么鬼?

2012年我入职TCL&#xff0c;在TCL我体会到了团队建设的文化&#xff0c;也正是经历了那段职场&#xff0c;我明白了很多「可意味不可言传」。那时候我们经常五十成群出去吃饭、喝酒、唱歌&#xff1b;上学那会我很不喜欢团队活动&#xff0c;特别是室内的活动&#xff0c;总感…

Alpha 答辩总结

【Alpha展示评审表格】 小组序号小组名称格式&#xff08;20%&#xff09;内容&#xff08;20%&#xff09;PPT&#xff08;20%&#xff09;演讲&#xff08;20%&#xff09;答辩&#xff08;20%&#xff09;总分1天机组1515151516762PMS1617171616824“像我这么能打的还有五个…

一粒沙子变成芯片的全过程

推荐阅读&#xff1a;专辑|Linux文章汇总专辑|程序人生专辑|C语言嵌入式Linux微信扫描二维码&#xff0c;关注我的公众号

使用指针星号转移c语言,C中的指针:何时使用号和星号?

你有指针和值&#xff1a;int* p; // variable p is pointer to integer typeint i; // integer value将指针转换为带*的值&#xff1a;int i2 *p; // integer i2 is assigned with integer value that pointer p is pointing to您可以将值转换为带&amp ;:的指针int* p2 …

使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法

使用oledb读写excel出现“操作必须使用一个可更新的查询”的解决办法 转自&#xff1a;http://www.cnblogs.com/Richinger/archive/2008/09/28/1301170.html 前两天使用oledb连接excel的办法为单位某部门从一个excel的多个sheet中作连选抽出需要的数据&#xff0c;程序非常简单…

要学会拒绝

Img「聊天截图」这是今晚上跟一个朋友聊天的截图&#xff0c;之后、突然想到这个话题&#xff0c;今年因为疫情&#xff0c;很多人抱怨工作不好找&#xff0c;我这个朋友&#xff0c;也是在疫情之下&#xff0c;可能是干得不开心&#xff0c;也可能还是干得不开心&#xff0c;可…

二叉树小球下落问题c语言,#C++初学记录(树和二叉树)

二叉树的编号 例题 6-6 小球下落问题 有一棵二叉树&#xff0c;最大深度为D&#xff0c;且所有叶子深度都相同。所有节点从上到下&#xff0c;从左到右编号为1,2,3,4&#xff0c;....&#xff0c;2^D-1。在节点1处放置小球&#xff0c;他会往下落。每个节点上都有一个开关&…

unique离散化用法

用法类似lower_bound,sort&#xff0c;不过下标从1开始的话和lower_bound减去的东西不一样 用来离散化很好用 pos就是在原数组a中的rank了&#xff0c;根据cnt建线段树啥的。。。 sort(a21, a21n);cnt unique(a21, a21n) - (a21);FOR(n) {int pos lower_bound(a21, a21cnt, a…

linux设备模型之kset/kobj/ktype分析

1. 概述今天来聊一下Linux设备模型的基石&#xff1a;kset/kobject/ktype。sysfs文件系统提供了一种用户与内核数据结构进行交互的方式&#xff0c;可以通过mount -t sysfs sysfs /sys来进行挂载&#xff1b;Linux设备模型中&#xff0c;设备、驱动、总线组织成拓扑结构&#x…

截取控件界面

介绍&#xff1a; 做项目中&#xff0c;遇到需要截取界面图形的内容&#xff0c;查找了所有的Graphics函数&#xff0c; 都没有此功能。只能用GDI32中的BitBlt来解决。应用需要调用的函数 class GDI32 { [DllImport("GDI32.dll")] public static extern bool BitB…

android 信号强度变化,Android监听WIFI网络的变化并且获得当前信号强度

MainActivity如下:package cc.testwifi;import android.os.Bundle;import android.app.Activity;/*** Demo描述:* 监听Wifi网络的变化并且获得当前信号强度***/public class MainActivity extends Activity {Overrideprotected void onCreate(Bundle savedInstanceState) {supe…

VLAN 路由实验图解

VLAN 路由实验图解(交换机为cisco1900系列)注&#xff1a;PC1&#xff1a;192.168.1.2 255.255.255.0PC2&#xff1a;192.168.2.2 255.255.255.0PC3&#xff1a;192.168.1.3 255.255.255.0PC4&#xff1a;192.168.2.3 255.255.255.0Fa0/0.1&#xff1a;192.168.1.1 255.255.255…

第 120 场双周赛 解题报告 | 珂学家 | 前后缀拆解 启发式合并

前言 忘名可以再记&#xff0c;回忆永不再来 整体评价 好像有一段时间没写周赛题解了&#xff0c;_. 感觉今天手感特别好&#xff0c;下午的几场比赛&#xff0c;包括传智杯都能打出超神战绩。 T3这题属于前后缀拆解&#xff0c;然后单调栈上二分(可以引入哨兵机制)&#xf…

音频系统,Alsa 里面的buff 是怎么计算的?

相关文章(干货)Ai音箱和Linux音频驱动小谈Linux ALSA 图解我在MTK平台下调试音频ALSA我们知道声音是模拟信号&#xff0c;模拟信号转成数字信号就一定有大小&#xff0c;既然有大小&#xff0c;那我们就需要开辟内存来保存这些数据。---- 我们知道&#xff0c;视频流的一帧就是…

android 多个启动页,Android启动页的问题整理

在一个方法一&#xff1a;设置起动模式一个Activity有四种启动模式&#xff1a;standard, singleTop, singleTask,singleInstance。standard: 标准模式&#xff0c;一调用startActivity()方法就会产生一个新的实例。singleTop:如果已经有一个实例位于Activity栈的顶部时&#x…

用一句话证明你是程序员,你会怎么说

这个文章没有正文突然想到的一个话题&#xff0c;感觉很有意思如果用一句话透露出你是一个程序员你会怎么表露自己了&#xff1f;留言偷偷告诉我&#xff1f;

新年来了,上海求职,路过看看

学历&#xff1a;信息管理专科&#xff0c;&#xff08;半个本科&#xff0c;今年才能毕业&#xff0c;自考&#xff09;出生&#xff1a;1980年2月IT技能&#xff1a;.net(C#)基本熟练掌握能理解多层构架&#xff0c;并运用到项目中去OOP思想基本掌握java略懂设计模式与UML入门…