当前位置 博文首页 > mcboke的博客:c语言整数在内存中的存储

    mcboke的博客:c语言整数在内存中的存储

    作者:[db:作者] 时间:2021-09-20 13:56

    一、整数在内存中的存储。

    ??????? 整型类型有: short (短整型? )、int(整型)、long(长整型)、char(字符)。

    ?????? 如果我们创建一个变量要在内存中开辟一段空间。空间的大小由变量的类型决定。

    ?????? 计算机中有符号数有三种:原码,反码,补码。三种码都是二进制码,最高位是符号位,其余是数值位。正数符号位是0,负数符号位是1

    ????? 下边讲解一下三种码之间的转换:

    (1)首先将一个有符号数转换成二进制数(原码)

    int a=10???? a的原码是:00000000? 00000000??? 00000000?? 00001010;//符号位是0,,其余是数值位。

    ????????????????????? 反码是:? 00000000? 00000000??? 00000000?? 00001010;

    ?????????????????????? 补码是:00000000? 00000000??? 00000000?? 00001010;正数的原码反码和补码二进制数一样。

    int b=-10;? b的原码是:10000000? 00000000??? 00000000?? 00001010;//符号位是1,其余是数值位。

    ????????????????????? 反码是: 11111111? 11111111?? 11111111? 11110101;? //原码变反码,符号位不变,其数值位按位取反。

    ???????????????????? 补码是: 11111111? 11111111?? 11111111? 11110110;? //反码变补码,符号位不变,对补码+1。

    补码变原码,将补码先取反在加一,或者按照原码变补码的逆过程。

    对于整型,计算机中存储的都属补码。计算机系统中数值都按补码来表示和存储。

    举个例子int main()
    {
    ?? ?char a = -1;
    ?? ?unsigned char b = -1;
    ?? ?signed char c = -1;
    ?? ?printf("%d\n%d\n%d\n", a, b, c);
    ?? ?return 0;
    }

    a和c都是有符号数,计算机里存储的是?? 11111111 但是打印时是按%d打印,会进行整型提升(会在另外一篇博客讲解),提升之后的结果为 11111111? 11111111? 11111111? 11111111?

    转换成原码,变成了10000000?? 00000000???? 00000000??? 00000001,即为10进制为(-1)。

    b是无符号数 ,计算机里存储的是?? 11111111,提升之后的结果为 00000000 ? 00000000 ? 00000000 ? 11111111? ,

    无符号数都是正数,所以原码和反码一样,转换成10进制数是255.

    例子2

    int main()
    {
    ?? ?unsigned char a = -128;
    ?? ?printf("%d", a);
    ?? ?return 0;
    }

    C语言中规定-128的二进制码为10000000(-0);计算机里存储的是1 00000000,他是无符号数,整型提升之后变为00000000 ? 00000000 ? 00000001? 00000000(原反补一样)

    转换成10进制数为128

    例子3

    int main()
    {
    ?? ?unsigned int i;
    ?? ?for (i = 9; i >= 0; i--)
    ?? ?{
    ?? ??? ?printf("%u\n", i);
    ?? ?}
    ?? ?return 0;
    }

    变成了死循环,当i=0时,0-1为-1;-1计算机里存储的是11111111?? 11111111? 11111111? 11111111,无符号打印,10级制数又变成了2^32-1,又大于0,就变成了死循环。

    ?

    ?

    ?

    ?

    cs
    下一篇:没有了