精华内容
下载资源
问答
  • int类型取值范围因计算机系统而异。早起的16位IBM PC兼容机使用16位来存储一个int值,其取值范围是-32769 ~32768。目前个人计算机一般是32位,因此用32位存储一个int值。现在随着个人计算机产业的发展,个人计算机...

    一. 普通int类型

    int类型是有符号整型,即int类型的值必须是整数,可以是正整数,负整数,零
    int类型取值范围因计算机系统而异。早起的16位IBM PC兼容机使用16位来存储一个int值,其取值范围是-32769 ~32768。目前个人计算机一般是32位,因此用32位存储一个int值。现在随着个人计算机产业的发展,个人计算机逐步迈向64位处理器发展,自然可以储存更大的整数。ISO C规定int的取值范围最小为-32769 ~32768。

    1.1打印int值

    我们知道可以使用printf()函数打印int类型的值,%d指明了在一行中打印整数的位置。
    %d称为转换说明。

    例1⃣️:

    # include <stdio.h>
    int main(void)
    {
        int i = 10;
        int j = 3;
        printf("%d %d\n", i, j);
        return 0;
    }
    

    Output:

    10 3
    

    第一个输出控制符%d 对应的是第一个输出参数i,第二个输出控制符%d对应的是第二个输出参数j


    例2⃣️:

    # include <stdio.h>
    int main(void)
    {
        int i = 10;
        printf("%d\n", i);  
        return 0;
    }
    

    这句话的意思是将变量 i 以十进制输出

    那么现在有一个问题:i 本身就是十进制,为什么还要将 i 以十进制输出呢

    因为程序中虽然写的是 i=10,但是在内存中并不是将 10 这个十进制数存放进去,而是将 10 的二进制代码存放进去了。计算机只能执行二进制 0、1 代码,而 0、1 代码本身并没有什么实际的含义,它可以表示任何类型的数据。所以输出的时候要强调是以哪种进制形式输出。所以就必须要有“输出控制符”,以告诉操作系统应该怎样解读二进制数据。


    例3⃣️:显示八进制和十六进制

    #include <stdio.h>
    
    int main(void)
    {
        int x =100;
        
        printf("dec = %d, octal = %o, hex = %x\n",x,x,x);
        printf("dec = %d, octal = %#o, hex = %#x\n",x,x,x);
    
        return 0;
       
    }
    

    Output:

    dec = 100, octal = 144, hex = 64
    dec = 100, octal = 0144, hex = 0x64
    

    以十进制显示数字,使用%d;以八进制显示数字,使用%o;以十六进制显示数字,使用%x。要显示各进制数的前缀0,0x,0X,必须分别使用%#o,%#x,%#X。

    二. 其他整数类型

    C语言还提供了3个关键字修饰基本整数类型:short,long,unsigned。

    名称 全称类型说明符 缩写类型说明符 位数 范围
    整型 int int 16位 -32768至+32767
    无符号整型 unsigned int unsigned 16位 0 至 65,535
    短整型 short int short 16位 -32768至+32767
    无符号短整型 unsigned short int unsigned short 16位 0 至 65,535
    长整型 long int long 32位 -2,147,483,648 至 2,147,483,647
    • short int类型(简写为short):占用空间可能比int少,常用于较小数值以节省空间。
    • long int类型(简写为long):占用空间可能比int多,常用于较大数值。
    • long long int类型(简写为long long):占用空间可能比long多,常用于更大数值的场合。
    • unsigned int(简写为unsigned):只用于非负值的场合。
    • 在C90标准中,添加了unsigned long int(简写为unsigned long)和unsigned short int(简写为unsigned short)
    • 在C99标准中,又添加了unsigned long long int(简写为unsigned long long)

    2.1使用多种整数类型原因

    为什么说short类型“可能”比int类型占用空间少,long类型“可能”比int类型占用空间多?因为C语言只规定了short占用空间不能多于int,long占用空间不能少于int。这样规定是为了适应不同的机器。例如,过去的一台运行Windows3.x的机器上,int类型和short类型都占16位,long类型占32位。后来,Windows和Mac OS都用上了16位存储short类型,32位存储int类型和long类型。现在计算机普遍使用64位处理器,为了储存64位整数,才引入了long long int类型。(使用位数越多可以表示的整数数值越大)。
    现在个人计算机上最常见的设置是,long long占64位,long占32位,short占16位,int占16位或32位。

    2.2如何选择数据类型

    int类型那么多,应该如何选择呢?

    1. 首先,考虑unsigned类型。这种类型常用于计数,因为计数不用负数,而且,unsigned可以表示更大的正数。
    2. 如果一个数超出了int类型的取值范围,且在long类型的取值范围内时,使用long类型。但是,对于那些long类型占用空间比int大的系统,使用long会减慢运算速度。因此,尽量不用long。
    3. 如果在long类型和int类型占用空间相同的机器上编写代码,当确实需要32位的整数时,应使用long而不是int,以便把程序移植到16位机器后仍然能正常工作。
    4. 如果确实需要64位的整数时,使用long long

    2.3如何打印

    • 打印unsigned int类型的值,使用%u
    • 打印unsigned long类型的值,使用%lu
    • 打印long long类型的值,使用%lld和%llu分别表示有符号与无符号类型
    • 打印long类型,使用%ld(如果系统中int和long大小相同使用%d就可以)
    • %lx表示以十六进制(hexadecimal )格式打印long类型
    • %lo表示比八进制(octal)格式打印long类型
    • %hd表示以十进制(decimal)格式打印short类型
    • %ho表示以八进制(octal)格式打印short类型
    • %hu代表以 unsigned short格式输出整数
    • %hx 代表以16进制的 输出short类型的整数

    scanf() 格式控制符汇总
    在这里插入图片描述

    《C primer plus》

    展开全文
  • 以8bit为例,有符号的数占用了一个符号位,只有7位数值,正数范围在2^7-1,负数范围在2^8,因为负数根据补码表示的,补码就是-1=127-128,补码是127,-0=128-128,补码是128,一共可以表示的补码是0-128,所以负数的...

    计算方法:
    以8bit为例,有符号的数占用了一个符号位,只有7位数值,正数范围在2^7-1,负数范围在2^8,因为负数根据补码表示的,补码就是-1=127-128,补码是127,-0=128-128,补码是128,一共可以表示的补码是0-128,所以负数的范围也是-128-0。
    无符号数据,则是全部用来做数据,有2^8。

    #include "stdafx.h"
    #include<ctype.h>
    #include<stdio.h>
    #include "limits.h"
    #include "float.h"
    /* atof: convert string s to double */
    #define MAXLINE 100
    /* rudimentary calculator */
    int main()
    {
        short smax = SHRT_MAX;
        short smin = SHRT_MIN;
        unsigned short int usmax = USHRT_MAX;
        printf("shor int %d \t %d\t unsigned shortmax%d\n", smax, smin,usmax);
    
        int imax = INT_MAX;
        int imin = INT_MIN;
        unsigned int uimax = UINT_MAX;
        printf("int %d \t %d\t unsigned intmax%u\n", imax, imin,uimax);
        //%d有符号,%u无符号
    
        long int lmax =LONG_MAX;
        long int lmin =LONG_MIN;
        unsigned long int ulmax=ULONG_MAX;
        printf("long int%d \t %d\t unsigned longmax%u\n", lmax, lmin,ulmax);
    
        char cmax = CHAR_MAX;
        char cmin = CHAR_MIN;
        char cbit = CHAR_BIT;
        unsigned char ucmax = UCHAR_MAX;
        printf("char %d \t %d\t%d\t unsigned charmax%d\n", cmax, cmin,cbit,ucmax);
    
        float fmax = FLT_MAX;
        float fmin = FLT_MIN;
        printf("float %f\t%f\n", fmax, fmin);//用十进制表示
        printf("float %e\t%e\n", fmax, fmin
    );//用科学表示指数
    
                  return 1;
    
    }

    float和double的范围是由指数的位数来决定的。
    float的指数位有8位,而double的指数位有11位,分布如下:
    float:
    1bit(符号位) 8bits(指数位) 23bits(尾数位)
    0 00000000 00000000000000000000000
    符号 指数 尾数

    double:
    1bit(符号位) 11bits(指数位) 52bits(尾数位)
    于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
    其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
    float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

    展开全文
  • char,short ,int ,long,long long,unsigned long long数据范围速查表: char -128 ~ +127 (1 Byte) short -32767 ~ + 32768 (2 Bytes) unsigned short 0 ~ 65535 (2 Bytes) int -2147483648 ~ +2147483647 (4 Bytes...

    char,short ,int ,long,long long,unsigned long long数据范围速查表:

    char -128 ~ +127 (1 Byte)
    short -32767 ~ + 32768 (2 Bytes)
    unsigned short 0 ~ 65535 (2 Bytes)
    int -2147483648 ~ +2147483647 (4 Bytes)
    unsigned int 0 ~ 4294967295 (4 Bytes)
    long == int
    long long -9223372036854775808 ~ +9223372036854775807 (8 Bytes)
    double 1.7 * 10^308 (8 Bytes)

    unsigned int 0~4294967295
    long long的最大值:9223372036854775807
    long long的最小值:-9223372036854775808
    unsigned long long的最大值:18446744073709551615

    __int64的最大值:9223372036854775807
    __int64的最小值:-9223372036854775808
    unsigned __int64的最大值:18446744073709551615

    详细教程:

    ====================

    符号属性 长度属性 基本型 所占位数 取值范围 输入符举例 输出符举例 
    -- -- char 8 -2^7 ~ 2^7-1 %c %c 、 %d 、 %u
    signed -- char 8 -2^7 ~ 2^7-1 %c %c 、 %d 、 %u
    unsigned -- char 8 0 ~ 2^8-1 %c %c 、 %d 、 %u
    [signed] short [int] 16 -2^15 ~ 2^15-1 %hd
    unsigned short [int] 16 0 ~ 2^16-1 %hu 、 %ho 、 %hx
    [signed] -- int 32 -2^31 ~ 2^31-1 %d
    unsigned -- [int] 32 0 ~ 2^32-1 %u 、 %o 、 %x
    [signed] long [int] 32 -2^31 ~ 2^31-1 %ld
    unsigned long [int] 32 0 ~ 2^32-1 %lu 、 %lo 、 %lx
    [signed] long long [int] 64 -2^63 ~ 2^63-1 %I64d
    unsigned long long [int] 64 0 ~ 2^64-1 %I64u 、 %I64o 、 %I64x
    -- -- float 32 +/- 3.40282e+038 %f 、 %e 、 %g
    -- -- double 64 +/- 1.79769e+308 %lf 、 %le 、 %lg %f 、 %e 、 %g
    -- long double 96 +/- 1.79769e+308 %Lf 、 %Le 、 %Lg

    几点说明: 

    1. 注意 ! 表中的每一行,代表一种基本类型。 “[]” 代表可省略。 
    例如: char 、 signed char 、 unsigned char 是三种互不相同的类型; 
    int 、 short 、 long 也是三种互不相同的类型。 

    2. char/signed char/unsigned char 型数据长度为 1 字节;
    char 为有符号型,但与 signed char 是不同的类型。 
    注意 ! 并不是所有编译器都这样处理, char 型数据长度不一定为 1 字节, char 也不一定为有符号型。 

    3. 将 char/signed char 转换为 int 时,会对最高符号位 1 进行扩展,从而造成运算问题。 
    所以 , 如果要处理的数据中存在字节值大于 127 的情况,使用 unsigned char 较为妥当。 
    程序中若涉及位运算,也应该使用 unsigned 型变量。 

    4. char/signed char/unsigned char 输出时,使用格式符 %c (按字符方式); 或使用 %d 、 %u 、 %x/%X 、 %o,按整数方式输出; 输入时,应使用 %c ,若使用整数方式, Dev-C++ 会给出警告,不建议这样使用。 

    5. int 的长度,是 16 位还是 32 位,与编译器字长有关。 
    16 位编译器(如 TC 使用的编译器)下, int 为 16 位; 32 位编译器(如 VC 使用的编译器 cl.exe )下, int 为32位。 

    6. 整型数据可以使用 %d (有符号 10 进制)、 %o (无符号 8 进制)或 %x/%X (无符号 16 进制)方式输入输出。而格式符 %u ,表示 unsigned ,即无符号 10 进制方式。 

    7. 整型前缀 h 表示 short , l 表示 long 。 
    输入输出 short/unsigned short 时,不建议直接使用 int 的格式符 %d/%u 等,要加前缀 h 。这个习惯性错误,来源于 TC 。 TC 下, int 的长度和默认符号属性,都与 short 一致,于是就把这两种类型当成是相同的,都用 int 方式进行输入输出。 

    8. 关于 long long 类型的输入输出: 
    "%lld" 和 "%llu" 是 linux 下 gcc/g++ 用于 long long int 类型 (64 bits) 输入输出的格式符。 
    而 "%I64d" 和 "%I64u" 则是 Microsoft VC++ 库里用于输入输出 __int64 类型的格式说明。 

    Dev-C++ 使用的编译器是 Mingw32 , Mingw32 是 x86-win32 gcc 子项目之一,编译器核心还是 linux 下的 gcc 。
    进行函数参数类型检查的是在编译阶段, gcc 编译器对格式字符串进行检查,显然它不认得 "%I64d" , 
    所以将给出警告 “unknown conversion type character `I' in format” 。对于 "%lld" 和 "%llu" , gcc 理所当然地接受了。 

    Mingw32 在编译期间使用 gcc 的规则检查语法,在连接和运行时使用的却是 Microsoft 库。 
    这个库里的 printf 和 scanf 函数当然不认识 linux gcc 下 "%lld" 和 "%llu" ,但对 "%I64d" 和 "%I64u" ,它则是乐意接受,并能正常工作的。 

    9. 浮点型数据输入时可使用 %f 、 %e/%E 或 %g/%G , scanf 会根据输入数据形式,自动处理。 
    输出时可使用 %f (普通方式)、 %e/%E (指数方式)或 %g/%G (自动选择)。 

    10. 浮点参数压栈的规则: float(4 字节 ) 类型扩展成 double(8 字节 ) 入栈。 
    所以在输入时,需要区分 float(%f) 与 double(%lf) ,而在输出时,用 %f 即可。 
    printf 函数将按照 double 型的规则对压入堆栈的 float( 已扩展成 double) 和 double 型数据进行输出。 
    如果在输出时指定 %lf 格式符, gcc/mingw32 编译器将给出一个警告。 

    11. Dev-C++(gcc/mingw32) 可以选择 float 的长度,是否与 double 一致。 

    12. 前缀 L 表示 long ( double )。 
    虽然 long double 比 double 长 4 个字节,但是表示的数值范围却是一样的。 
    long double 类型的长度、精度及表示范围与所使用的编译器、操作系统等有关。

    展开全文
  • -32768~32767unsigned int取值范围:0~65535short /short int取值范围:比intunsigned short无符号短整型long长整型定义时,后面加上l或L有符号与无符号数:unsigned:无符号数,一般用来表示数据signed:...

    一、整型

    int

    • 取值范围:-32768~32767

    unsigned  int

    • 取值范围:0~65535

    short  /short  int

    • 取值范围:比int小

    unsigned  short

    • 无符号短整型

    long

    • 长整型

    • 定义时,后面加上l或L

    有符号与无符号数:

    • unsigned:无符号数,一般用来表示数据

    • signed:有符号数,一般用来表示数字

    整型占位符:

    int

    • 使用%d

    unsigned  int

    • 使用%u

    long

    • 10进制显示:%ld。  如果系统中int与long大小相同,用%d也可以

    • 8进制显示:%lo

    • 16进制显示:%lx

    unsigned  long

    • %lu

    short

    • 10进制显示:%d、%hd

    • 8进制显示:% ho

    二、字符型

    char

    • 占位符:%c

    • 有符号的范围:-128~127

    • 无符号的范围:0~255

    转义字符

    \a警告
    \b退格
    \f换页
    \n换行
    \r回车
    \t水平制表符
    \v垂直制表符
    \\反斜杠\
    \'单引号
    \"双引号
    \?问号
    \0oo八进制值(oo必须是有效的八进制数,即0~7中的一个数)
    \xxxx也是八进制值
    \xhh十六进制数(hh必须是有效的十六进制数,即0~f中的一个数)
    • 例如:\x4d  ==>字符M    \12(换行符)

    • 键盘按住alt不送,键盘输入数字,松开alt,就会打印数字对应的字符

    三、浮点型

    float 

    • 精确到小数点后6~7位。4字节

    • 占位符:%f

    • 定义时,后面加上f或F。如果没有加,编辑器会默认帮你升级为double类型

    double 

    • 精确到小数点16-17位。8字节

    • 占位符:%lf

    long  double

    • float:对速度快,精度要求不高时使用

    • double:对精度要求高,数据很大的时候使用

    四、void

    • void  a;   //a并没有什么意义,也没有开辟空间,只是声明有这个变量而已。等到强制类型转化时才开辟空间存储

    五、打印八进制、十六进制

    • 8进制:前缀0

    • 16进制:前缀0x或0X

    • %o:8进制显示数字

    • %x:16进制显示数字

    • %#o:8进制数字前面带有0前缀

    • %#x、%#X:16进制数字前面带有0x或0X前缀

    • int  a=08;      //08位八进制数

    • int  b=0x15;  //15为十六进制数

    六、ASCII

    3b33d26da704ac81320ab7ccda8b5c73.png

    这里大家需要记住几个常用的 字符'0'对应的码值是48    ,字符’A‘对应的码值是65, ’a‘对应的是97.

    如果你已经有一定的C语言基础了,那么你可以看这块代码:

    这段代码就是将你输入的字符进行强制转换成int类型的值。

    #include int main(){     char a = ' ';     int  b = 0;     while(1){       a = getchar();       b = (int)a;       printf("%d",b);     }}

    下面是我通过GDB断点调试,打印输出a的地址,以及a地址内的值,可以看出,实际上字符在内存里的值仍然是97(只不过我把它转成10进制,当然你可以看二进制的数值)

    0aacb5cc15df6feba9a02a3760e648e7.png

    这俩看不懂,不要紧,我会在C语言的基础部分抽出2-4个文章来专门讲调试(linux下的gdb,和windows下的debug都会分开讲),这样你看C语言的指针部分将不再迷茫,看内存不迷路。

    f3170edc851ed4e4139d7e2952ec712d.gif

    展开全文

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 508
精华内容 203
关键字:

int数据范围shortunsigned