在计算机中,整数数据以二进制形式 翻译成 补码 存储在内存中。
字节序指的是字节在内存中存储的顺序。有大端字节序和小端字节序两种。
大端字节序表示高位字节存储在低地址,低位字节存储在高地址。比如整数0x12345678以大端字节序存储时,在内存中的地址从低到高依次是0x12、0x34、0x56、0x78。
小端字节序表示高位字节存储在高地址,低位字节存储在低地址。比如整数0x12345678以小端字节序存储时,在内存中的地址从低到高依次是0x78、0x56、0x34、0x12。
字节序的选择取决于计算机体系结构,不同的处理器架构可能采用不同的字节序。在编程时,跨平台开发时要注意字节序的影响
建议直接从主函数观看理解代码,如果有任何不懂的问题,欢迎在下方评论,进行解答!
——————————————————————————————————————————
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <limits.h>
#include <windows.h>
#include <string.h>
int check_sys()
{
int a = 1;
return *(char*)&a;
}
int main()
{
INT_MAX;/*宏定义的一个最大范围*/
int num = 10;
//创建一个整形变量,叫num,这时num向内存申请4字节~32个比特位
// 符号位 数值位
//正数原反补相同
//负数(数字-10为例子) 最高位是符号位1表示负数
//1 0000000 00000000 00000000 00001010
//反码:符号位不变 其它位0变1,1变0
//1 1111111 11111111 11111111 11110101
//补码:反码+1
//1 1111111 11111111 11111111 11110110
//整数在内存中存的是补码,且是倒着存储的
//vs为了方便显示,用16进制表示
//-10
//F6 FF FF FF
//计算1-1
// 00000000 00000000 00000000 00000001 是1的补码
// 11111111 11111111 11111111 11111111 是-1的补码
//100000000 00000000 00000000 00000000 1+(-1)是这样的计算的计算机
//把存放的地址看出x横轴,那么左边:低地址 右边:高地址
// 0x11 22 33 44
//11 22 33 44 大端字节序
//44 33 22 11 小端字节序
//大端字节序存储:把数据低位,存放在高地址
//小端字节序存储:把数据低位,存放在低地址
//计算机一般存储是小端字节序
int a=1;
char* p = (char *) & a;//int*
//如何判断小端还是大端字节序
if (1 == *p)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
int ret=check_sys();
if(1==ret)
{
printf("小端\n");
}
else
{
printf("大端\n");
}
//对于整形家族(char short int long),有:有符号和无符号的区分
// 有符号最高位是符号位
// 无符号所以的位全是有效位(算补码的时候高位补0再算,因为无符号数默认是正数)
// char 是不确定的
// int == signed int;
// unsigned int;
// short == signed short;
// unsigned short;
// long == signed long;
// unsigned long;
char aa = -1;
signed ab = -1;
//1 00000000 00000000 00000000 0000001正
//1 11111111 11111111 11111111 1111110反
//1 11111111 11111111 11111111 1111111补(存储的数据)
//由于char只能容纳1字节~8bit
//所以从低位,截出来8bit
//1 1111111--aa,bb(发生整形提升)--发现是负数
/*-------------计算机存储和读取分界线-----------------*/
//1 11111111 11111111 11111111 1111111补(存储的数据)
//1 11111111 11111111 11111111 1111110反
//1 00000000 00000000 00000000 0000001正
unsigned char ac = -1;
//00000000 00000000 00000000 00000001正
//11111111 11111111 11111111 11111110反
//11111111 11111111 11111111 11111111补
//1111111--ac(发生整形提升)--发现是正数
/*-------------计算机存储和读取分界线-----------------*/
//00000000 00000000 00000000 11111111补-反-正相同
//%d 十进制有符号整形整数
//整形提升 按变量数据类型的符号位来提升
printf("a=%d,b=%d,c=%d\n",ab,ab,ac);
//-1 -1 255
char aaa = -128;
//1 00000000 00000000 00000000 10000000正
//1 11111111 11111111 11111111 01111111反
//1 11111111 11111111 11111111 10000000补
//1 10000000
/*-------------计算机存储和读取分界线-----------------*/
//1 11111111 11111111 11111111 10000000 -128 有符号数
//11111111 11111111 11111111 10000000 好大一个数字
printf("d:aaa=%d u:aaa=%u\n",aaa,aaa);
char aaaa = 128;
//00000000 00000000 00000000 10000000
//10000000
//11111111 11111111 11111111 10000000
printf("d:aaaa=%d u:aaaa=%u\n", aaaa, aaaa);
int i = -20;
unsigned int j = 10;
//1 10000000 00000000 00000000 00010100 正
//1 11111111 11111111 11111111 11101011反
//1 11111111 11111111 11111111 11101100补
//下面的存储方式具体如何存储要看是%d,还是%u,
//1 11111111 11111111 11111111 11101100 i的存储(%d)
//1 11101100 i的存储(%u)
//0000000 00000000 00000000 00001010 j的存储(%d)
//00001010 j的存储(%u)
//1 11101100
// 00001010
//1 11110110(存) i和j的存储
//补码-->源码的2种方法
//@1 -1 取反
//@2 取反 +1
//1 00001010(读)
//11111111 11111111 11111111 11110110
printf("%d,%u\n", i + j, i + j);
char a1[1000];
int i1;
for (i1=0;i>1000;i++)
{
a1[i1] = -1 - i1;
}
printf("%d",strlen(a1));
-----------------------------------------------------------------------------------------------------------------------------
//下面这个是一个死循环-1无符号数是一个很大的数字
unsigned int i;
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
Sleep(1000);
}
//同样是死循环
unsigned char i2 = 0;//unsigned char 0~255
for (i=0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}