Chapter1_基本数据类型之整型(int)

来源:互联网 发布:mac重置 编辑:程序博客网 时间:2024/06/06 03:12

一、 整型的分类
  由上一篇文,可以看到,整型分为char,short int ,int ,long int,它们有分别分为unsigned和signed,也给出各自的最小范围,不同的机子范围不尽相同。下面看一下一个简单的例子
Code:

#includeint main(){    //int    unsigned int uInteger = 99;    int integer = -99;    //short int    unsigned short int  uShortInteger = 98;    short int shortInteger = -98;    //long int    unsigned long int uLongInteger = 97;    long int longInteger = -97;    //char    unsigned char uCharA = 'A';    unsigned char uChar67 = 67;    char char67 = -67;    //print    printf("unsigned int: %d,\tsize:%ld\nint:\t\t%d,\tsize:%ld\n",           uInteger, sizeof(uInteger), integer, sizeof(integer));    printf("unsigned short int: %d,\tsize:%ld\nshort int:\t%d,\tsize:%ld\n",           uShortInteger, sizeof(uShortInteger), shortInteger, sizeof(shortInteger));    printf("unsigned long  int: %ld,\tsize:%ld\nlong int:\t%ld,\tsize:%ld\n",           uLongInteger, sizeof(uLongInteger) , longInteger, sizeof(longInteger) );    printf("unsigned char A: %c,%d,\tsize:%ld\n",uCharA,uCharA, sizeof(uCharA));    printf("unsigned char 67: %c,%d,\tsize:%ld\n",uChar67,uChar67, sizeof(uChar67));    printf("char -67: %c,%d,\tsize:%ld\n",char67,char67, sizeof(char67));    return 0;}

  这里是关于不同的整型变量的声明和输出,以及使用sizeof()输出对应变量的大小。
  很简单的一个程序,我们只要它最终结果是在终端打印对应变量的值和所占空间大小就行了。
下面是运行截图:
Img:
showAllIntSize.c_run.png
  我们可以看到,在我这个电脑上,int所占空间是4个字节,short int 是两个字节,long int是8个字节,char是1个字节,无论是unsigned还是signed所占空间大小一样。
  针对上的程序说3点:
  1. 所占空间和取值范围的关系(以unsigned int为例):
  所占空间单位是4个字节,每个字节有8个位,所以int是32个位大小,1个位所说的就是一个二进位,每个位能表达的就只有0和1两种状态,一个位所能表达的十进制最大是2^1-1=1,两个二进位最大是(11)2=2^2-1=3(看不懂的请百度进制),所以在我这一台电脑,int类型所能表达最大的数字是2^32-1=4294967295(对应这种计算,请使用excel=_=随便找个格子输入“=2^32-1”(“”不需要输入),然后点一下别的地方结果就出来了),所以他的范围是0到4294967295
  2. 有符号和无符号,正负零:
  既然所占空间有符号和无符号是相同的,那为什么所表示的范围可以不同,注意这里用词是范围不同,不是范围大小不同,他们的范围大小基本上是一样的,仅仅相差1个数字,有符号的范围应该是-2^(32-1)-1到2^(32-1)-1(-2147483647到+2147483647),当时实际上它的范围是-2^(32-1)到2^(32-1)-1(-2147483648到+2147483647),第一个范围很好理解,因为有一位做符号为所以32位的空间只有31位在表示数字,至于实际范围会多出一位,这就涉及到计算机的存储问题了,计算机我们通常用二进制补码存储数字,这时源码0就会对应两个两个补码0(正负0),以两个位来举例(10)2和(00)2分别+0和-0,但是都对应源码0(因为位的补码(10)2转成源码位(100)2超出了2位溢出部分截掉,成为(00)2),而在我们自己运用过程中,或者说自然科学里是不存在正负零之分的,所以在C语言中规定了-0为-INT_MAN-1,有兴趣的朋友可以去看一下计算机科学类的书,也可以留言和我讨论。
此处应有代码:
Code:

#include <stdio.h>int main(){    signed int zeroShow  =  -2147483646, i;    for(i = 0; i < 10 ; i++,zeroShow--)        printf("zeroShow:%d\n",zeroShow);    return 0;}

运行截图:
Zero100.c_run.png

调试截图:
Zero100.c_gdb.png

limit.h中规定:
limit.h_INT_MIN.png
3. Char类型:
char类型是整型,对应ASCII码表,上面程序分别使用了%c(字符输出格式)和%d(整型输出格式),都可以输出char类型,分别输出对应的字符和对应的ASCII十进制码
二、 整型的溢出
既定了整型的大小,那么超出范围的数值将发生溢出,值发生改变,这个溢出也和计算机数值的存储有关,以4位二进制表示无符号整型为例(1111)2=(15)10,所以它的范围是0到15,如果在15上加1,就会发生:(1111)2 + (1)2 =(10000)2=(16)10,由于是4位二进制,所以超出部分无处存放,丢弃掉所以:(1111)2 + (1)2 =(0000)2=(0)10
code:

#include <stdio.h>int main(){    unsigned short int integer = 65530;    short int integer2 = 32762;    int i = 0;     for(i = 0; i < 10; i++){        printf("integer=%d\t size:%ld\n", integer, sizeof(integer));        integer++;    }    printf("----------------------------------------------------\n");    for(i = 0; i < 10; i++,integer2++)        printf("integer2=%d\t size:%ld\n", integer2, sizeof(integer2));    return 0;}

运行截图:
intOverSize.c_run.png
三、 进制问题
  本来是打算长篇大论一通来着,想想网上有挺多这种的,就不写了,就提两个点:
1. 10进制快速转换二进制装逼版
  只举例(自己去举一反三):
  35 = 32 + 2 + 1 = 2^5 + 2^1 + 2^0 = (100011)2
  126= 64 +32 +16 + 8 + 4 +2 =2^6 + 2^5 + 2^4 + 2^3 +2^2 +2^1 = (1111110)2
  (1111110)–>(6543210)存在为1不存在为0654321存在0不存在所以(1111110)2
  要知道2N=2N-1+2N-2+….20+1
2. 16进制换二进制法
  记住每位16进制码对应的四位二进制码,即:1对应0001,f对应1111等等
  举例:
  0xff10abcd = (f f 1 0 a b c d)16 = (1111 111 0001 0000 1010 1011 1100 1101)2

0 0
原创粉丝点击