整数是咱们生活中经常使用的数据类型,也是编程中经常使用的一种数据,C语言使用int关键字来定义整数变量(int是 integer 的简写)。程序员
在定义变量的时候,能够加signed、unsigned、short和long四种修饰符。编程
signed:有符号的,能够表示正数和负数。数组
unsigned:无符号的,只能表示正数,例如数组的下标、人的身高等。ide
short:短的,如今主流的64位操做系统下,整数占用内存4个字节,使用 4
个字节保存较小的整数绰绰有余,会空闲出两个字节来,这些字节就白白浪费掉了。在C语言被发明的早期,或者在单片机和嵌入式系统中,内存都是很是稀缺的资源,全部的程序都在尽量节省内存。函数
long:长的,更长的整数。学习
整数的取值范围与计算机操做系统和C语言编译器有关,没有一个固定的数值,咱们能够根据它占用的内存大小来推断它的取值范围。测试
一个字节有8个位,表示的数据的取值范围是2^8^-1,即255。操作系统
若是占用的内存是两个字节,无符号型取值范围是2^8^ⅹ2^8^-1。.net
若是占用的内存是四个字节,无符号型取值范围是2^8^ⅹ2^8^ⅹ2^8^ⅹ2^8^-1。code
若是占用的内存是八个字节,无符号型取值范围是2^8^ⅹ2^8^ⅹ2^8^ⅹ2^8^ⅹ2^8^ⅹ2^8^ⅹ2^8^ⅹ2^8^-1。
若是是有符号,取值范围减半,由于符号占一个位。
下面用一个示例代码来测试各类整数占用内存的大小。
示例(book60.c)
/* * 程序名:book60.c,此程序演示整数占用内存的大小和取值范围。 * 做者:C语言技术网(www.freecplus.net) 日期:20190525 */ #include <stdio.h> int main() { short si; // 短整数 int ii; // 整数 long li; // 长整数 printf("sizeof short is %d\n",sizeof(short)); printf("sizeof int is %d\n",sizeof(int)); printf("sizeof long is %d\n",sizeof(long)); }
运行效果
sizeof是C语言中保留关键字,是一种运算符,不是函数,sizeof其实是获取了数据在内存中所占用的存储空间,以字节为单位。
int ii; // sizeof(int)和sizeof(ii)均可以。
根据book60.c的测试结果,咱们能够获得各类整数的取值范围。
类型简写 | 类型全称 | 长度 | 取值范围 |
---|---|---|---|
short | [signed] short [int] | 2字节 | -32768\~32767 |
unsigned short | unsigned short [int] | 2字节 | 0\~65535 |
int | [signed] int | 4字节 | -2147483648\~2147483647 |
unsigned int | unsigned [int] | 4字节 | 0\~4294967295 |
long | [signed] long [int] | 8字节 | -9223372036854775808\~ 9223372036854775807 |
unsigned long | unsigned long [int] | 8字节 | 0\~18446744073709551615 |
注意:
1)计算机用最高位1位来表达符号,unsigned修饰过的正整数不须要符号位,在表达正整数的时候比signed修饰的正整数取值大一倍。
2)在写程序的时候,上表中括号[]的单词能够省略不书写。
3)在写程序的时候,给整数变量赋值不能超出变量的取值范围,编译的时候会出现相似如下的错误,程序运行也可能产生不可预后的后果。
4)如今计算机的内存不值钱,建议程序员少用short,慎用int,多用long,内存不是问题,程序的稳定高于一切。
如下表格中,重点记住第1、二行十进制的输出格式,二十年来,八进制数我历来没有用过,十六进制数只在显示内存的地址时见过,因此你们没必要关心八进制和十六进制的相关知识,了解便可。
注意一个坑:输出格式控制符的类型最好与变量的类型一一对应,不然会出现意外的后果,示例:
int i=32767; printf("i %hd,%d\n",i,i); int j=32768; printf("j %hd,%d\n",j,j);
输出结果:
i 32767,32767 j -32768,32768 // 获得了意外的输出结果,32768超出了short的取值范围。
%hd用于输出短整数,最大值是32767,能够输出32767,但不能正常的输出32768。
一个数字默认就是十进制的,表示一个十进制数字不须要任何特殊的格式。可是,表示一个二进制、八进制或者十六进制数字就不同了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来讲,就是在数字前面加上特定的字符,也就是加前缀。
二进制由 0 和 1 两个数字组成,使用时必须以0b或0B(不区分大小写)开头,例如:
// 如下是合法的二进制 int a = 0b101; // 换算成十进制为 5 int b = -0b110010; // 换算成十进制为 -50 int c = 0B100001; // 换算成十进制为 33
// 如下是非法的二进制 int m = 101010; // 无前缀 0B,至关于十进制 int n = 0B410; // 4不是有效的二进制数字
请注意,标准的C语言并不支持上面的二进制写法,只是有些编译器本身进行了扩展,才支持二进制数字。换句话说,并非全部的编译器都支持二进制数字,只有一部分编译器支持,而且跟编译器的版本有关系。
八进制由 0\~7 八个数字组成,使用时必须以0开头(注意是数字 0,不是字母o),例如:
// 如下是合法的八进制数 int a = 015; // 换算成十进制为 13 int b = -0101; // 换算成十进制为 -65 int c = 0177777; // 换算成十进制为 65535 // 如下是非法的八进制 int m = 256; // 无前缀 0,至关于十进制 int n = 03A2; // A不是有效的八进制数字
十六进制由数字 0\~九、字母 A\~F 或a\~f(不区分大小写)组成,使用时必须以0x或0X(不区分大小写)开头,例如:
// 如下是合法的十六进制 int a = 0X2A; // 换算成十进制为 42 int b = -0XA0; // 换算成十进制为 -160 int c = 0xffff; // 换算成十进制为 65535 // 如下是非法的十六进制 int m = 5A; // 没有前缀 0X,是一个无效数字 int n = 0X3H; // H不是有效的十六进制数字
在现实生活和工做中,咱们在写十进制数的时候,为了对齐或其它缘由,在数值前面加0是可有可无的,可是,在C语言中,不要在十进制数前加0,会被计算机误认为是八进制数。
C语言提供了几个经常使用的库函数,声明以下:
int atoi(const char *nptr); // 把字符串nptr转换为int整数 long atol(const char *nptr); // 把字符串nptr转换为long整数 int abs(const int j); // 求int整数的绝对值 long labs(const long int j); // 求long整数的绝对值
示例(book61.c)
/* * 程序名:book61.c,此程序演示整数的atoi atol abs labs函数的使用 * 做者:C语言技术网(www.freecplus.net) 日期:20190525 */ #include <stdio.h> #include <stdlib.h> // 若是不包含这个头文件,会出现意外的结果。 int main() { int ii; long ll; ii=atoi("-2147483647"); ll=atol("-9223372036854775807"); printf("ii=%d\n",ii); printf("ll=%ld\n",ll); ii=abs(ii); ll=labs(ll); printf("ii=%d\n",ii); printf("ll=%ld\n",ll); }
运行效果
C语言容许程序员使用 typedef关键字来给数据类型定义一个别名,别名通常有两个特色:1)名称更短;2)更符合程序员的习惯。
例如unsigned int起个size_t的别名。
typedef unsigned int size_t; size_t ii; 等同于 unsigned int ii;
咱们来看看strlen函数的帮助,strlen的返回值就是size_t类型。
在实际开发中,会用到随机数这个功能,例如编写游戏类的程序时就须要用到随机数。
在C语言中,咱们使用 \<stdlib.h\> 头文件中的 srand和rand 函数来生成随机数。
void srand(unsigned int seed); // 随机数生成器的初始化函数 int rand(); // 获一个取随机数
srand函数初始化随机数发生器(俗称种子),在实际开发中,咱们能够用时间做为参数,只要每次播种的时间不一样,那么生成的种子就不一样,最终的随机数也就不一样,一般咱们采用\<time.h\> 头文件中的 time 函数便可获得一个精确到秒的时间做为种子。
示例(book63.c)
/* * 程序名:book63.c,此程序用于演示随机数 * 做者:C语言技术网(www.freecplus.net) 日期:20190525 */ #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int ii; srand(time(0)); // 播下随机种子 for (ii=0;ii<5;ii++) // 生成5个随机数 { printf("%d ", rand()); // 获取随机数 } printf("\n"); }
运行效果
在实际开发中,需求每每是必定范围内的随机数,对于产生必定范围的随机数,就须要使用必定的技巧,经常使用的方法是取模运算(取余数),再加上一个加法运算:
int a = rand() % 50; // 产生0~49的随机数
若是要规定上下限:
int a = rand() % 51 + 100; // 产生100~150的随机数
取模即取余数,rand()%51+100,rand()%51是产生 0\~50 的随机数,后面+100保证 a最小只能是 100,最大就是 50+100=150。
1)编写示例程序,判断short、unsigned short、int、unsigned int、long、unsigned long占用内存的字节数。
2)选择题:请问int的取值范围是多少?
(A)二十多亿 (B) -2147483648\~2147483647 (C) 0\~4294967295
3)选择题:请问long的取值范围是多少?
(A)不少个亿 (B) 足够大 (C) -9223372036854775808\~9223372036854775807
4)编写示例程序,从界面上输入数字的字符串,存放在字符串变量中,而后用atoi函数转换为整数,加上100后再输出到屏幕。
5)在C语言中,还有一种long long int的整数,各位写一个程序,测试它占用内存的字节数和取值范围,并思考long long int类型是否具有实用价值。
6)编写示例程序,测试short、unsigned short、int、unsigned、long、unsigned long赋值超出了取值范围的后果。
7)重写整数的abs和labs库函数,实现其功能,函数的声明以下:
int ABS(const int j); // 求int整数的绝对值 long LABS(const long int j); // 求long整数的绝对值
8)利用已经学习的知识,自定义一个函数,函数名是ctoi,把字符的'0'、'1'、'2'、'3'、'4'、'5'、'6'、'7'、'8'、'9'转换为整数的0、一、二、三、四、五、六、七、八、9。函数的声明以下:
int ctoi(const char chr); chr为用字符方式表示的数字,函数的返回值为数字的整数。
提示:采用if或switch语句,判断chr的值,直接返回结果。
调用示例:
printf("'0' is %d\n",ctoi('0')); // 输出结果是'0' is 0 printf("'9' is %d\n",ctoi('9')); // 输出结果是'9' is 9
如下做业题难度较大,若是没法完成,不要过于纠结,之后功力提高了再作。
9)自定义一个函数,函数名是POW,利用已经学习的知识,求一个数的n次幂,函数的声明以下:
// 求x的y次幂,函数返回值为x的y次幂。 long POW(const int x,const int y);
调用示例:
printf("POW(2,3) is %lu\n",POW(2,3)); // 输出结果是8 printf("POW(10,3) is %lu\n",POW(10,5)); // 输出结果是100000
10)编写示例程序,把字符串里的数字所有加起来,例如字符串是"90576483975423",所有加起来结果是72。
11)重写整数的atoi和atol库函数,实现其功能,函数的声明以下:
int ATOI(const char *nptr); // 把字符串nptr转换为int整数 long ATOL(const char *nptr); // 把字符串nptr转换为long整数
提示:例如字符串的"12305",转为整数12305,拆开就是10000+2000+300+0+5,即1*104+2*103+3*102+0*101+5*100
12)生成五十二个随机数,存放在数组中,范围是1-52,不容许重复,最后在屏幕上显示出来。
13)编写一个扑克的发牌程序,一副牌除了大小王,还有52张牌,随机洗牌,再发给四我的。
提示:
(1)把一副牌的所有牌面能够用1-52的数值表示,数组是一个好选择;
(2)洗牌就是生成范围在1-52之间不重复的随机数。
(3)定义四个数组,表明四我的,把洗好的52个数按顺序赋给四个数组就好了。若是不想定义四个数组,用一个二维数组也行。
(4)把四个数组的值显示出来,就是每一个人的牌面。
C语言技术网原创文章,转载请说明文章的来源、做者和原文的连接。
来源:C语言技术网(www.freecplus.net)
做者:码农有道
若是这篇文章对您有帮助,请点赞支持,或在您的博客中转发个人文章,谢谢!!!若是文章有错别字,或者内容有错误,或其余的建议和意见,请您留言指正,很是感谢!!!