整数的原码 反码与补码,大尾小尾存储

helloworld

//注释
/*注释*/
#include <stdio.h>
int main()
{
    printf("hello world\n");
    return 0;
}

Bit与Byte

1byte = 8bit
1bite只能存储:0或1
1个byte能存储: 2^8 -1个0或1,其范围是[-128,127]或[0,255]

数据能存储的位置:寄存器,内存,磁盘等.

整数的编码

整数包括负数、零与正数,在计算机中整数又分为有符号数数与无符号数。有符号数的最高位表示符号:最高位为0时,最高位为1时,表示负数。无符号数表示非负数,整个位数都用来表示整数的值。如果分别有一个8位的有符号数与无符号数,其范围如下:

  • 有符号数:[-2^(8-1),2^(8-1) - 1]=[-128,127]
  • 无符号数:[0,2^8-1] = [0,255]
整数的原码、反码与补码
  • 原码:数值前有一位符号位,其他位表示数值的大小。
  • 反码:正整数的反码是其自身,而负整数的反码其绝对值逐位求反。
  • 补码:正整数的补码和原码相同,负数的补码就是对负数的反码加1.
数值原码反码补码
70000 01110000 01110000 0111
-11000 00011111 11101111 1111

-100的原码是 1110,0100 ,反码为:1001,1011,其绝对值是: 0110,0100,取反之后:1001,1011,+1之后为补码,所以补码为:1001,1100.而计算机内部负数的保存方式是负数的补码:

0.负数的补码存储方式

为什么要在计算机中将负数存储成补码,若采用原码的方式:对于负数的负号没办法表示;采用反码的方式:1-1=1+(-1)=(0000,0001)+(1111,1110)= 1111,1111 = (-0),这样会出现+0与-0的情况;采用补码的方式则无问题。

常见的补码表示有:

数值补码
1281000,0000
-11111,1111
00000,0000
1270111,1111
整数的存储

计算机数据存储在内存中时,因为内存的存储控件呈线性分布,多字节存储时,可分为 高位存储(big-endian)低位优先存储(little-endian)

高位优先存储:高位优先存储在低地址上;
地位优先存储:低位优先存储在低地址上。

可用程序测试你的计算机是地位优先还是高位优先:

//方式1
void integer_store()
{
    int x = 0x1;
    char *p = (char *)&x;
    if(*p == 1)
        printf("big endian\n");
    else
        printf("little-endian\n");
}

//方式2
typedef union {
    char c;
    int a;
} U;
void integer_store()
{
    U u;
    u.a = 1;
    if(u.c == 1)
        printf("big endian\n");
    else
        printf("little-endian\n");
}

//在程序这运行测试
int main(void)
{
    integer_store();
    return 0;
}

0.大尾小尾存储

整数大尾小尾互换
int change_int_storage(int val) 
{ 
    int iRun = 0, i = 0; 
    char* pByte= (char*)&val; //指向整数的低地址,取一个字节
    i = sizeof(int)-1; 
    while (i >= 0) 
    { 
        iRun |= *pByte<<(i*8);//把整数的第1字节,第2字节,第3字节,第四4字节一次左移24位,16位,8位和0位 
        pByte++;
        i--;
     } 
    return iRun; 
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值