请你简述大端字节序和小端字节序的概念,并设计一个小程序来判断是大端储存还是小端储存
大端储存就是高位放在低地址,反之
小端储存就是高位放在搞地址,反之
#include <stdio.h>
int fun()
{
int a = 1;
char *p = (char*)&a;
return *p;//char类型的指针只能操作一个字节的数
//解引用操作放回的是a的数据类型
}
int main()
{
int ret = fun();
if (ret == 1)
{
printf("是小端储存\n");//0x01000000
}
else
{
printf("是大端储存\n");//0x00000000
}
return 0;
}

2.打印的是什么结果

//分析char a =-1;
//对char来说进行整形提升
10000000000000000000000000000001//原码
11111111111111111111111111111110//反码
11111111111111111111111111111111//补码
截断
11111111
补充位
11111111111111111111111111111111
//在内存中是以补码的形式存在的,打印出来的是原码
signed char 和 char是一样的意思
unsigned char进行补充位的时候
00000000000000000000000011111111//补码,是正数,三个码都相同
打印出来是255
最后的结果是-1,-1,255
3

%d-打印出十进制的有符号数字
%u-打印出十进制的无符号数字
char a = -128
//10000000000000000000000001000000//原码
//11111111111111111111111110111111//反码
//11111111111111111111111111000000//补码
截断
10000000
补位(因为打印出来的结果是无符号数字)正数也是原码
00000000000000000000000010000000
打印的结果是128
char= 128
//00000000000000000000000010000000//原码,补码,反码相同
//截断
10000000
//补位(打印的是无符号数字)
00000000000000000000000010000000
打印出来的是128
4

10000000000000000000000000010100//i的原码
11111111111111111111111111101011//反码
11111111111111111111111111101100//补码
00000000000000000000000000001010;//j的原码,反码,补码
两个数的补码进行相加
11111111111111111111111111110110结果
打印出来的是他的原码
补码减1是反码
11111111 11111111 1111111 111110101//反码
1000000000000000000000000000001010//原码
打印出来的结果是-10;
5.char是如何储存的?


6

i是无符号整数一直大于0
所以有 9 8 7 6 5 4 3 2 1 然后一直死循环
7

这里的char是有符号的数字,打印出来的是一个char数组,是一个字符串,字符串的结束标志是“\0”他的ASCll码值是0,也就是说碰到0就停止计数了,而且\0并不是包含在数字里面。
有,-1,-2,-3.......-128,-129(-128-1)指的就是127(看上面那个圈圈)........0(一共有128+127(0不算)=255
8

因为unsigned char的范围是0-255所以都<=255
死循环