数据的存储1

1:写一个小程序来判断当前机器的字节序

逻辑:写一个数 0X11223344 看它的11和44分别放在内存中什么位置  如果11放在内存中的高位(右边的位置)那么就是大端字节序 如果44放在内存中高位地址位置(右边)那么就是小端字节序

但是这个数太复杂了 应该用一个小一点的数 比如00 00 00 01 如果是小端字节序 那应该存储为 01 00 00 00 而大端第一个地址存的是00 这样判断的逻辑 就更加简单 这样判断第一个字节的字节序 就很容易判断出此机器是大端字节序还是小端字节序 放一个1 这个整数 整数就涉及到大小端的问题 如果是小端 第一个字节放的是01 如果是大端 第一个字节放的是00  怎么才能拿到这个数的第一个字节呢 这一个难点 char *P这个指针变量 如果解引用 就是访问它的第一个字节

#include <stdio.h>

int main()

{

int a = 1;

char *p = (char *)&a;  //&a 本质上是一个整形的地址 非要放在一个char类型的指针变量里 就需要强制类型转换(char *),因为我把a的地址给p了 所以p就指向了a四个字节的起始地址

if(*p == 1)//解引用p就访问了a的起始地址的第一个字节 两位是一个地址 int类型有8个位 4个地址 起始地址就是第一个地址 当你拿到第一个字节里的数值如果是1 那就说明是小端字节序

{

printf("该机器的字节序是小端字节序");

}    

else

{

printf("该机器的字节序是大端字节序");

}

}

2:以下的程序输出什么?

#include <stdio.h>

int main()

{

char a = -1; /

signed char b = -1;  

unsigned char c = -1;

  printf("a=%d=%d,c=%d:,a,b,c);

}

/ /第一行从从右到左 先写出-1的原码 1000 0000 0000 0000 0000 0000 0000 0001  然后变成补码 1111 1111 1111 1111 1111 1111 1111 1111 再变成char类型 1111 1111

//第一行从从右到左 先写出-1的原码 1000 0000 0000 0000 0000 0000 0000 0001  然后变成补码 1111 1111 1111 1111 1111 1111 1111 1111 再变成char类型 1111 1111

//第三行从从右到左 先写出-1的原码 1000 0000 0000 0000 0000 0000 0000 0001  再转成补码 1111 1111 1111 1111 1111 1111 1111 1111 再转成char类型

//输出先看%d 先执行变成有符号整形提升

有符号的a变成有符号的 符号位不变 1 其他补符号位 1111 1111 1111 1111 1111 1111 1111 1111 这个补码 要输出必须先转成原码 1是符号位 不变 其他取反+1 得 1000 0000 0000 0000 0000 0000 0000 0001 然后转成10进制 得-1 这个a    a和b一样

无符号的c变成有符号的 整形提升看原来的符号 无符号 所以全部补0 得0000 0000 0000 0000 0000 0000 1111 1111

然后转换成10进制 得255

return 0;

}

3:下面程序的输出结果是:

#include <stdio.h>

int main()

{

char a = -128;

printf("%u\n",a);

return 0;

}

// 先写出-128的二进制原码 1000 0000 0000 0000 0000 0000  1000 0000

 再变成补码 1111 1111 1111 1111 1111 1111 1111 1000 0000

再变成char类型得 1000 0000

//做整形提升 看原数字 有符号补1 1111 1111 1111 1111 1111 1111 1000 0000

%u 就代表着这个数左位不是符号位 这样就是个正数 原反补一样

再转成10进制 得4294967168

4:以下程序输出什么

#include <stdio.h>

int main()

{

char = 128;

printf("%u\n",a);

return 0;

}

//步骤 1 先把128原码32位弄出来 0000 0000 0000 0000 0000 0000 1000 0000

然后原码转补码  0000 0000 0000 0000 0000 0000 1000 0000

然后转char 1000 0000

然后整形提升 原数字是有符号的 补符号位 1111 1111 1111 1111 1111 1111 1000 0000

然后正数的原反补一样 转化成10进制数得4294967168

5:内存里如果看到1000 0000 直接被解析成-128

6:有符号的char 取值范围 -128~127

7:char类型极端 0~127~128~-127~0 这样轮回

8:以下代码输出什么

int main()

{

int i = -20;

unsigned int j = 10;

printf("%d\n",i+j);

return 0;

}

//思路:先写出-20的原码 1000 0000 0000 0000 0000 0000 0001 0100          

转补码 1111 1111 1111 1111 1111 1111 1110 1100

再写出10的原码 0000 0000 0000 0000 0000 0000 0000 1010

转补码 0000 0000 0000 0000 0000 0000 0000 1010

1111 1111 1111 1111 1111 1111 1110 1100 +

0000 0000 0000 0000 0000 0000 0000 1010

两个补码相加 得2进1

得到补码的和     1111 1111 1111 1111 1111 1111 1111 0110

再转原码

                         1000 0000 0000 0000 0000 0000 0000 1010

再转成10进制 得-10

9:两个二进制位相加 符号位异号就取1 同号就取0

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值