精华内容
下载资源
问答
  • 但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是前缀。 1) 二进制 二进制0 和 1 两个数字...

    二进制数、八进制数和十六进制数的表示

    一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。

    1) 二进制

    二进制由 0 和 1 两个数字组成,使用时必须以0b0B(不区分大小写)开头,例如:

    /合法的二进制
    int a = 0b101;  //换算成十进制为 5
    int b = -0b110010;  //换算成十进制为 -50
    int c = 0B100001;  //换算成十进制为 33
    //非法的二进制
    int m = 101010;  //无前缀 0B,相当于十进制
    int n = 0B410;  //4不是有效的二进制数字

    读者请注意,标准的C语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

    下面是实际测试的结果:

    • Visual C++ 6.0 不支持。
    • Visual Studio 2015 支持,但是 Visual Studio 2010 不支持;可以认为,高版本的 Visual Studio 支持二进制数字,低版本的 Visual Studio 不支持。
    • GCC 4.8.2 支持,但是 GCC 3.4.5 不支持;可以认为,高版本的 GCC 支持二进制数字,低版本的 GCC 不支持。
    • LLVM/Clang 支持(内嵌于 Mac OS 下的 Xcode 中)。

    2) 八进制

    八进制由 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不是有效的八进制数字

    3) 十六进制

    十六进制由数字 0~9、字母 A~F 或 a~f(不区分大小写)组成,使用时必须以0x0X(不区分大小写)开头,例如:

    //合法的十六进制
    int a = 0X2A;  //换算成十进制为 42
    int b = -0XA0;  //换算成十进制为 -160
    int c = 0xffff;  //换算成十进制为 65535
    //非法的十六进制
    int m = 5A;  //没有前缀 0X,是一个无效数字
    int n = 0X3H;  //H不是有效的十六进制数字

    4) 十进制

    十进制由 0~9 十个数字组成,没有任何前缀,和我们平时的书写格式一样,不再赘述。

    二进制数、八进制数和十六进制数的输出

    C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

      short int long
    八进制 %ho %o %lo
    十进制 %hd %d %ld
    十六进制 %hx 或者 %hX %x 或者 %X %lx 或者 %lX


    十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

    • %hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;
    • %hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。


    八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。如果你比较叛逆,想使用大写形式,那么行为是未定义的,请你慎重:

    • 有些编译器支持大写形式,只不过行为和小写形式一样;
    • 有些编译器不支持大写形式,可能会报错,也可能会导致奇怪的输出。


    注意,虽然部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制,这一点比较遗憾。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。考虑到读者的基础还不够,这里就先不讲这种方法了。

    【实例】以不同进制的形式输出整数:

    #include <stdio.h>
    int main()
    {
        short a = 0b1010110;  //二进制数字
        int b = 02713;  //八进制数字
        long c = 0X1DAB83;  //十六进制数字
       
        printf("a=%ho, b=%o, c=%lo\n", a, b, c);  //以八进制形似输出
        printf("a=%hd, b=%d, c=%ld\n", a, b, c);  //以十进制形式输出
        printf("a=%hx, b=%x, c=%lx\n", a, b, c);  //以十六进制形式输出(字母小写)
        printf("a=%hX, b=%X, c=%lX\n", a, b, c);  //以十六进制形式输出(字母大写)
        return 0;
    }

    运行结果:
    a=126, b=2713, c=7325603
    a=86, b=1483, c=1944451
    a=56, b=5cb, c=1dab83
    a=56, b=5CB, c=1DAB83

    从这个例子可以发现,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。

    输出时加上前缀

    请读者注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

    • 对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。
    • 对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。
    • 对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。


    区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

    #include <stdio.h>
    int main()
    {
        short a = 0b1010110;  //二进制数字
        int b = 02713;  //八进制数字
        long c = 0X1DAB83;  //十六进制数字
       
        printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c);  //以八进制形似输出
        printf("a=%hd, b=%d, c=%ld\n", a, b, c);  //以十进制形式输出
        printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c);  //以十六进制形式输出(字母小写)
        printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c);  //以十六进制形式输出(字母大写)
       
        return 0;
    }

    运行结果:
    a=0126, b=02713, c=07325603
    a=86, b=1483, c=1944451
    a=0x56, b=0x5cb, c=0x1dab83
    a=0X56, b=0X5CB, c=0X1DAB83

    十进制数字没有前缀,所以不用加#。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加#,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。

    展开全文
  • 但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是前缀。1) 二进制二进制0 和 1 两个数字组成,...

    C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。

    二进制数、八进制数和十六进制数的表示

    一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。

    1) 二进制

    二进制由 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语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

    下面是实际测试的结果:

    Visual C++ 6.0 不支持。

    Visual Studio 2015 支持,但是 Visual Studio 2010 不支持;可以认为,高版本的 Visual Studio 支持二进制数字,低版本的 Visual Studio 不支持。

    GCC 4.8.2 支持,但是 GCC 3.4.5 不支持;可以认为,高版本的 GCC 支持二进制数字,低版本的 GCC 不支持。

    LLVM/Clang 支持(内嵌于 Mac OS 下的 Xcode 中)。

    2) 八进制

    八进制由 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不是有效的八进制数字

    3) 十六进制

    十六进制由数字 0~9、字母 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不是有效的十六进制数字

    4) 十进制

    十进制由 0~9 十个数字组成,没有任何前缀,和我们平时的书写格式一样,不再赘述。

    二进制数、八进制数和十六进制数的输出

    C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

    short

    int

    long

    八进制

    %ho

    %o

    %lo

    十进制

    %hd

    %d

    %ld

    十六进制

    %hx 或者 %hX

    %x 或者 %X

    %lx 或者 %lX

    十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

    %hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;

    %hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。

    八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。如果你比较叛逆,想使用大写形式,那么行为是未定义的,请你慎重:

    有些编译器支持大写形式,只不过行为和小写形式一样;

    有些编译器不支持大写形式,可能会报错,也可能会导致奇怪的输出。

    注意,虽然部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制,这一点比较遗憾。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。考虑到读者的基础还不够,这里就先不讲这种方法了。

    【实例】以不同进制的形式输出整数:

    #include

    int main()

    {

    short a = 0b1010110; //二进制数字

    int b = 02713; //八进制数字

    long c = 0X1DAB83; //十六进制数字

    printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形似输出

    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

    printf("a=%hx, b=%x, c=%lx\n", a, b, c); //以十六进制形式输出(字母小写)

    printf("a=%hX, b=%X, c=%lX\n", a, b, c); //以十六进制形式输出(字母大写)

    return 0;

    }

    运行结果:

    a=126, b=2713, c=7325603

    a=86, b=1483, c=1944451

    a=56, b=5cb, c=1dab83

    a=56, b=5CB, c=1DAB83

    从这个例子可以发现,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。

    输出时加上前缀

    请读者注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

    对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。

    对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。

    对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。

    区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上#即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

    #include

    int main()

    {

    short a = 0b1010110; //二进制数字

    int b = 02713; //八进制数字

    long c = 0X1DAB83; //十六进制数字

    printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c); //以八进制形似输出

    printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出

    printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c); //以十六进制形式输出(字母小写)

    printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c); //以十六进制形式输出(字母大写)

    return 0;

    }

    运行结果:

    a=0126, b=02713, c=07325603

    a=86, b=1483, c=1944451

    a=0x56, b=0x5cb, c=0x1dab83

    a=0X56, b=0X5CB, c=0X1DAB83

    十进制数字没有前缀,所以不用加#。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加#,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。

    展开全文
  • 但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是前缀。 (1)二进制 二进制0 和 1 两个数字...

    C语言中的整数除了可以使用十进制,还可以使用二进制、八进制和十六进制。

    一、二进制数、八进制数和十六进制数的表示

    一个数字默认就是十进制的,表示一个十进制数字不需要任何特殊的格式。但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是加前缀。

    (1)二进制

    二进制由 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语言并不支持上面的二进制写法,只是有些编译器自己进行了扩展,才支持二进制数字。换句话说,并不是所有的编译器都支持二进制数字,只有一部分编译器支持,并且跟编译器的版本有关系。

    (2)八进制

    八进制由 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不是有效的八进制数字

    (3)十六进制

    十六进制由数字 0~9、字母 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不是有效的十六进制数字

    (4)十进制

    十进制由 0~9 十个数字组成,没有任何前缀,和平时的书写格式一样。

    二、二进制数、八进制数和十六进制数的输出

    C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:

      short int long
    八进制 %ho %o %lo
    十进制 %hd %d %ld
    十六进制 %hx 或者 %hX %x 或者 %X %lx 或者 %lX

    十六进制数字的表示用到了英文字母,有大小写之分,要在格式控制符中体现出来:

    • %hx、%x 和 %lx 中的x小写,表明以小写字母的形式输出十六进制数;
    • %hX、%X 和 %lX 中的X大写,表明以大写字母的形式输出十六进制数。

    八进制数字和十进制数字不区分大小写,所以格式控制符都用小写形式。如果想使用大写形式,那么行为是未定义的:

    • 有些编译器支持大写形式,只不过行为和小写形式一样;
    • 有些编译器不支持大写形式,可能会报错,也可能会导致奇怪的输出。

    注意,虽然部分编译器支持二进制数字的表示,但是却不能使用 printf 函数输出二进制,这一点比较遗憾。当然,通过转换函数可以将其它进制数字转换成二进制数字,并以字符串的形式存储,然后在 printf 函数中使用%s输出即可。
     

    三、以不同进制的形式输出整数:

    #include <stdio.h>
    
    int main()
    {
        short a = 0b1010110; //二进制数字
        int b = 02713; //八进制数字
        long c = 0X1DAB83; //十六进制数字
    
        printf("a=%ho, b=%o, c=%lo\n", a, b, c); //以八进制形式输出
        printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出
        printf("a=%hx, b=%x, c=%lx\n", a, b, c); //以十六进制形式输出(字母小写)
        printf("a=%hX, b=%X, c=%lX\n", a, b, c); //以十六进制形式输出(字母大写)
    
        return 0;
    }

    运行结果:

    a=126, b=2713, c=7325603
    a=86, b=1483, c=1944451
    a=56, b=5cb, c=1dab83
    a=56, b=5CB, c=1DAB83

    可以发现,一个数字不管以何种进制来表示,都能够以任意进制的形式输出。数字在内存中始终以二进制的形式存储,其它进制的数字在存储前都必须转换为二进制形式;同理,一个数字在输出时要进行逆向的转换,也就是从二进制转换为其他进制。

    输出时加上前缀

    注意观察上面的例子,会发现有一点不完美,如果只看输出结果:

    • 对于八进制数字,它没法和十进制、十六进制区分,因为八进制、十进制和十六进制都包含 0~7 这几个数字。
    • 对于十进制数字,它没法和十六进制区分,因为十六进制也包含 0~9 这几个数字。如果十进制数字中还不包含 8 和 9,那么也不能和八进制区分了。
    • 对于十六进制数字,如果没有包含 a~f 或者 A~F,那么就无法和十进制区分,如果还不包含 8 和 9,那么也不能和八进制区分了。

    区分不同进制数字的一个简单办法就是,在输出时带上特定的前缀。在格式控制符中加上 #即可输出前缀,例如 %#x、%#o、%#lX、%#ho 等,请看下面的代码:

    #include <stdio.h>
    
    int main()
    {
        short a = 0b1010110; //二进制数字
        int b = 02713; //八进制数字
        long c = 0X1DAB83; //十六进制数字
    
        printf("a=%#ho, b=%#o, c=%#lo\n", a, b, c); //以八进制形似输出
        printf("a=%hd, b=%d, c=%ld\n", a, b, c); //以十进制形式输出
        printf("a=%#hx, b=%#x, c=%#lx\n", a, b, c); //以十六进制形式输出(字母小写)
        printf("a=%#hX, b=%#X, c=%#lX\n", a, b, c); //以十六进制形式输出(字母大写)
    
        return 0;
    }

    运行结果:

    a=0126, b=02713, c=07325603
    a=86, b=1483, c=1944451
    a=0x56, b=0x5cb, c=0x1dab83
    a=0X56, b=0X5CB, c=0X1DAB83
    

    十进制数字没有前缀,所以不用加 #。如果你加上了,那么它的行为是未定义的,有的编译器支持十进制加 #,只不过输出结果和没有加#一样,有的编译器不支持加#,可能会报错,也可能会导致奇怪的输出;但是,大部分编译器都能正常输出,不至于当成一种错误。

    展开全文
  • 一、十进制转换为二进制数 十进制转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制的整数部分和小数部分分别转换后,再加以合并。 1. 十进制整数转换为二进制整数 十进制整数转换为二进制...

    一、十进制数转换为二进制数
    十进制数转换为二进制数时,由于整数和小数的转换方法不同,所以先将十进制数的整数部分和小数部分分别转换后,再加以合并。
    1. 十进制整数转换为二进制整数
    十进制整数转换为二进制整数采用"除2取余,逆序排列"法。具体做法是:用2去除十进制整数,可以得到一个商和余数;再用2去除商,又会得到一个商和余数,如此进行,直到商为零时为止,然后把先得到的余数作为二进制数的低位有效位,后得到的余数作为二进制数的高位有效位,依次排列起来。
    【例1 】 把 (173)10 转换为二进制数。
    在这里插入图片描述

    2.十进制小数转换为二进制小数
    十进制小数转换成二进制小数采用"乘2取整,顺序排列"法。具体做法是:用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数 部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为零,或者达到所要求的精度为止。
    然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
    【例2】把(0.8125)10转换为二进制小数。
    在这里插入图片描述
    【例3】(173.8125)10=( )2
    解: 由【例1】得(173)10=(10101101)2
    由【例2】得(0.8125)10=(0.1101)2
    把整数部分和小数部分合并得: (173.8125)10=(10101101.1101)2
    更具体二进制和十进制之间的转换参考:https://jingyan.baidu.com/article/597a0643614568312b5243c0.html

    二、浮点类型数据的存储
    对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit,double数据占用64bit,不论是float还是double在存储方式上都是遵从IEEE的规范的,float遵从的是IEEE R32.24 ,而double 遵从的是R64.53。

    无论是单精度还是双精度在存储中都分为三个部分:

    符号位(Sign) : 0代表正,1代表为负
    指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储
    尾数部分(Mantissa):尾数部分
    其中float类型数据的存储方式如下图所示:
    在这里插入图片描述

    而double类型数据的存储方式为:
    在这里插入图片描述

    R32.24和R64.53的存储方式都是用科学计数法来存储数据的,比如8.25用十进制的科学计数法表示为:8.2510º,而120.5可以表示为:1.20510²。而计算机根本不认识十进制的数据,他只认识0,1。所以在计算机存储中,首先要将上面的数更改为二进制的科学计数法表示。8.25用二进制表示可表示为1000.01。120.5用二进制表示为:1111000.1。用二进制的科学计数法表示1000.01可以表示为1.0000110³,1111000.1可以表示为1.111000110^6。第一位都是1,所以可以将小数点前面的1省略,所以23bit的尾数部分,可以表示的精度却变成了24bit,道理就是在这里,那24bit能精确到小数点后几位呢,我们知道9的二进制表示为1001,所以4bit能精确十进制中的1位小数点,24bit就能使float能精确到小数点后6位,而对于指数部分,因为指数可正可负,8位的指数位能表示的指数范围就应该为:-127-128了,所以指数部分的存储采用移位存储,存储的数据为元数据+127,下面就看看8.25和120.5在内存中真正的存储方式。

    值得注意的一个问题是:书上说之所以要将指数加上 127 来得到阶码,是为了简化浮点数的比较运算,这一点我没有体会出来。但是通过 127 这个偏移量 (移码),可以区分出指数的正负。阶码为 127 时表示指数为 0;阶码小于 127 时表示负指数;阶码大于 127 时表示正指数。

    首先看下8.25,用二进制的科学计数法表示为:1.00001*10³

    按照上面的存储方式,符号位为:0,表示为正,指数位为:3+127=130 ,位数部分为,故8.25的存储方式如下图所示:
    在这里插入图片描述

    而单精度浮点数120.5的存储方式如下图所示:
    在这里插入图片描述
    具体浮点型数据存储方式参考:https://wenku.baidu.com/view/905828797fd5360cbb1adb07.html

    展开全文
  • 最近被这样一道题弄哭,查了好多资料,才勉强弄懂,废话不多说,请看题。 #include "stdio.h"... D.65535 A.0 B.1 C.255 D.65535   要弄清楚这个问题,我们首先要明确的是...
  • 对于刚开始学习C语言的来说,我们知道%d可以表示十进制的,%o可以表示八进制的,%x用来表示十六进制的,但却没有来表示二进制数的。 这就是相对应的八进制和十六进制#include &lt;stdio.h&gt; ...
  • 先将十进制转换为二进制数,然后从末位开始,以每三位为一组,前面不够三位补0,然后按照二进制转十进制的方法依次算出每三位的值,所得结果按顺序输出即为十六进制的形式。 十进制转十六进制 先将十进制...
  • 十进制下二进制数为十进制下长得像二进制数为只由0,1组成的数字,例如1,10,101,1100等。 给定一个正整数 n(1<=n<=10^9),要求输出小于等于n的自然数中满足十进制下二进制数的个数。 输入样例:18 输出样例:...
  • 但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是前缀。1) 二进制二进制0 和 1 两个数字组成,...
  • Excel实现有符号十进制二进制数

    千次阅读 2017-08-31 18:41:53
      最近需要用到将Excel中范围为-1023~+1023的数据转换为二进制,其实这个问题完全可以通过Matlab编程来解决,但是呢,得到的结果要重新复制进Excel表格中,也没有那么方便,所以想直接用Excel中的公式来进行十进制...
  • 连续输入多个八进制,转为二进制数 问题描述:在控制台连续输入多个八进制(中间用空格隔开),把这些八进制转为二进制数。 源代码如下: # include<iostream> using namespace std; //说明:234的个...
  • 一、输出十进制、十六进制、八进制数: dec: 指示cout以十进制输出。 December hex: 指示cout以十六进制输出。 Hexadecimal oct: 指示cout以八进制输出。 October #include<iostream> using namespace ...
  • 十进制转二进制:用十进制除以二进制数,得到的每一位余数就是二进制数的构成,但是要倒序输出才是正常的二进制。 过程如下: 比如整数10 10%2 = 0; 10/2= 5; 5%2 = 1; 5/2 = 2; 2%2 = 0; 2/2 =1;注意上一步中...
  • 那么我们会发现,10%2是判断二进制数的最后一位是0还是1,判断完成后向右移一位即10/2得到5,接着5%2判断二进制数的倒数第二位是0还是1,判断完成后向右移一位即5/2得2,重复这个过程,直到0/2结束。最终我们得到了...
  • 但是,表示一个二进制、八进制或者十六进制数字就不一样了,为了和十进制数字区分开来,必须采用某种特殊的写法,具体来说,就是在数字前面加上特定的字符,也就是前缀。1) 二进制二进制0 和 1 两个数字组成,...
  • 十进制转换为二进制并输出,本文仅讨论整数部分  方法:除2取余法,即每次将整数部分除以2,余数为该位权上的,而商继续除以2,余数又为上一个位权上的,这个步骤一 直持续下去,直到商为0为止;最后读时候...
  • 二进制的1101转化成十进制 1101(2)=1*2^0+0*2^1+1*2^2+1*2^3=1+0+4+8=13 转化成十进制要从右到左用二进制的每个去乘以2的相应次方 不过次方要从0开始十进制转二进制: 用2辗转相除至结果为1 将余数和最后的1...
  • Java中输入一个十进制,如何转换为二进制数

    万次阅读 多人点赞 2016-07-14 20:42:41
    方法一:利用Java API直接转换十进制如何转换为二进制数,这在Java API 中有一个方法,Integer.toBinaryString( ) 括号里面写上你要转换的十进制,这样可以直接转换。例如:public static void main(String[] ...
  • 文章目录#十进制转换为二进制数1、十进制整数转换为二进制整数2、十进制小数转换为二进制小数#浮点类型数据的存储#参考 #十进制转换为二进制数   十进制转换为二进制数时,由于整数和小数的转换方法不同,...
  • 计算二进制数0的个数

    千次阅读 2015-07-27 16:58:17
    输入一个10进制数字,请计算该数字对应二进制0的个数,注意左第一个1之前的所有0都不需要计算。不需要考虑负数的情况。 输入: 要计算的十进制非负数 输出: 二进制中第一个1之后0 的个数 思路:一个整形32位...
  • **二进制转十进制,十进制转二进制,位运算符 | 和 &** 先看个例子 位运算符: | 是将两边数字转为二进制做位对比,两个位只要有一个为1,那么结果都为1。否则就为0 67|33 67//转为二进制为1000011 33//转为...
  • 最近在用Python写遗传算法时,发现需要将十进制的整数转换成二进制数,那么怎么来转换呢?当然如果你学过进制转换的有关计算方法,你可以手动编写一些函数来实现,不过总体来说还是比较麻烦的,这里介绍Python内置的...
  • POJ - 3252二进制数位DP

    千次阅读 2021-01-18 09:14:47
    1.前导0不算二进制表示下的0的数量,因此前面有1,后面的0才算数量。 2.位DP的记忆化,必须要保证!limit或者limit,避免状态冲突! AC代码: #include <iostream> #include <cstring> using namespace...
  • Java十进制整数转化为二进制数 import java.util.Scanner; public class Test01 { public static void main(String[] args) { //输入十进制整数 Scanner sc = new Scanner(System.in); System.out.print("请...
  • 蓝桥杯题目---非法二进制数

    千次阅读 2018-12-01 17:00:12
    如果一个二进制数包含连续的两个1,我们就称这个二进制数是非法的。 小Hi想知道在所有 n 位二进制数(一共有2n个)中,非法二进制数有多少个。 例如对于 n = 3,有 011, 110, 111 三个非法二进制数。 由于结果可能...
  • 10进制转换为16位二进制数

    千次阅读 2020-03-29 17:46:32
    写在前面: 题解是对具体题目的编程实现,不会具体讲解C语言语法。请先大致学习好语法,自己敲敲代码后再看题解(上来就直接看题解的习惯不好哟~)。在每一题的题解之前,会列出本题涉及到的语法知识供参考,可以在...
  • 那么我们会发现,10%2是判断二进制数的最后一位是0还是1,判断完成后向右移一位即10/2得到5,接着5%2判断二进制数的倒数第二位是0还是1,判断完成后向右移一位即5/2得2,重复这个过程,直到0/2结束。最终我们得到了...
  • 二进制数与位运算符

    2020-12-04 13:41:21
    二进制数表示整数18 ECMAScript整数有两种类型,即有符号整数(允许用正数和负数)和无符号整数(只允许用正数)。在ECMAScript中,所有整数字面量默认都是有符号整数。 有符号整数使用31位(第0到第30位)表示整数...
  • 32位系统sizeof(int)=4,也就是有32位二进制数,内存中是以32位二进制补码的形式存放这个的,int为有符号,最前面一个数字是符号位,0表示正数,1表示负数。 也就是31位存储这个的大小。 正数的补码就是他的...
  • Redis提供了SETBIT,GETBIT,BITCOUNT,BITOP四个命令用于处理二进制位数组(bit array,又称"位数组"). 位数组的表示 使用SDS结构保存位数组,使用SDS的操作函数处理位数组。但是,为了简化SETBIT的实现,保存位数组的...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 416,456
精华内容 166,582
关键字:

二进制数前面加0