C语言--数据类型--取值范围

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言--数据类型--取值范围相关的知识,希望对你有一定的参考价值。

     

技术分享

 

 

 

C 语言基本数据类型:字符型(char)整形(short, int, long)浮点型(float, double)

 

注:如下类型字节数指一般情况,不同的平台会有所不同,具体平台可以用sizeof 关键字测试一下.

 

类型 字节数 类型 字节数
char  1 short 2
int  2(16位系统)或4(32位系统)  long 4
float 4 double 8

 

 

 

 

 

 

 

 

 

 

 


 

类型 范围 类型 范围
(signed)char -128~~127 unsigned char 0~~255
(signed)short -32768~~32767 unsigned short 0~~65535
(signed)int -32768~~32767 unsigned int 0~~65535
(signed)long

-2147483648~~2147483647

unsigned long

0~~4294967295

float

 -3.4*10-38 ~~ 3.4*1038

double

 -1.7*10-308 ~~ 1.7*10308

 

 

 

 

 

 

 

 

 

 

 

 


 

1. 运算会导致字符型/整型溢出其取值范围

eg.

int main() 
{ 
    signed char ch = 127;
    ch += 1;
    printf("%d\\n", ch);

    return 0; 
}

输出结果为:-128,注意,定义ch时赋予的值为127,已经是char能表示的最大数,其最终结果-128的来历是这样的:

第一步:首先127在计算机中用二进制表示为:01111111;

第二步:01111111 + 00000001 = 10000000;

第三步:由于ch是带符号的,当最高位为1时,表示是负数,而负数的计算机中是利用补码来存储的,回忆计算负数补码的方法(首先取负数的绝对值,然后求二进制,对二进制取反,在对取反后的值加1,即为负数的补码);

第四步:于是根据求补码的反步骤,我们来求最原始的负数,由于本题中补码为10000000,首先10000000 - 00000001 = 01111111,然后对01111111取反为10000000,10000000 = 128,由于本身是负数,即ch为-128.

 

eg.

int main() 
{ 
    unsigned char ch = 255;
    ch += 1;
    printf("%d\\n", ch);

    return 0; 
}

输出结果为:0;

其分析为:首先ch = 255提升为整形,在计算机的存储为:(000....)11111111,然后(000....)11111111+1 = (000...)0001 00000000;然后再将最后的八位二进制截取给ch,由于最后八位全是0,因此ch = 0了。

同理:对于遇到整形int short, long等出现上述情况时,我们也可以这样分析得到结果.

 

2.用预处理指令#define 声明一个常数,用以表明1年中有多少秒?

#define SECOND_PER_YEAR (60*60*24*365)UL

 

①#define语法的基本常识(例如:不能以分号结束,括号的使用等等)

  所有宏定义、枚举常数、只读变量全用大写字母命名,用下划线分割单词.

  const int MAX_LENGTH = 100; //这不是常量,而是一个只读变量,具体请往后看

 

    #define FILE_PATH  “/usr/tmp”

②写出你是如何计算一年中有多少秒而不是计算实际的值,会更有价值

③意识到这个表达式将使一个int数溢出,因此最好用的长整形,那么你就会为自己加分了

 

以上是关于C语言--数据类型--取值范围的主要内容,如果未能解决你的问题,请参考以下文章

C语言各个数据类型取值范围

64位系统下C语言中int值的取值范围

C语言--数据类型--取值范围

C语言中怎么计算一个类型的取值范围?如 char 用程序算

c语言中双精度浮点数(即double类型数据)的取值范围

C语言int的取值范围