c语言整数在内存中的存储

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

        整型类型有: 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,就变成了死循环。

 

 

 

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值