判断机器大小端

int check_sys(){
int a = 1;
return *(char*)&a; //返回1小端 返回0大端
}

整型提升

#include <stdio.h>
int main()
{
char a= -1;
//原码1000 0000 0000 0000 0000 0000 0000 0001
//补码1111 1111 1111 1111 1111 1111 1111 1111
//char截取8位补码 1111 1111
//整型提升 高位补32个1 再转成原码 对应真值为-1
signed char b=-1;
//原码1000 0000 0000 0000 0000 0000 0000 0001
//补码1111 1111 1111 1111 1111 1111 1111 1111
//char截取8位补码 1111 1111
//整型提升 高位补32个1 再转成原码 对应真值为-1
unsigned char c=-1;
//原码1000 0000 0000 0000 0000 0000 0000 0001
//补码1111 1111 1111 1111 1111 1111 1111 1111
//char截取1111 1111
//整型提升 无符号char 高位补24个0 再转成原码 对应真值为255
printf("a=%d,b=%d,c=%d",a,b,c);
return 0;
}
#include <stdio.h>
int main()
{
char a = -128;
//原码1 0000 0000 0000 0000 0000 0001 0000 000
//补码1 1111 1111 1111 1111 1111 1111 0000 000
//char截取 1000 0000
//整型提升 高位补1 1111 1111 1111 1111 1111 1111 1000 0000
//无符号打印 原码 1111 1111 1111 1111 1111 1111 1000 0000
//真值 略
printf("%u\n",a);
return 0;
}
#include <stdio.h>
int main()
{
char a = 128;
//原码0000 0000 0000 0000 0000 0000 1000 0000
//补码0000 0000 0000 0000 0000 0000 1000 0000
//char截取 1000 0000
//整型提升 有符号 高位补1 1111 1111 1111 1111 1111 1111 1000 0000
// 无符号 原码 1111 1111 1111 1111 1111 1111 1000 0000
printf("%u\n", a);
return 0;
}
#include <stdio.h>
int main()
{
int i = -20;
//原码 1000 0000 0000 0000 0000 0000 0001 0100
//补码 1111 1111 1111 1111 1111 1111 1110 1100
//int截取32位补码
unsigned int j = 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
// 1111 1111 1111 1111 1111 1111 1111 0110
//原1000 0000 0000 0000 0000 0000 0000 1010
//真值-10
printf("%d\n", i + j);
}

char的范围

int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i; //-1...-128 127 126...1 0 -1...
}
printf("%d", strlen(a)); //strlen找到\0结束 128+127=255
return 0;
}

浮点数内存中的形式

int main()
{
int n = 9;
// 补码0000 0000 0000 0000 0000 0000 0000 1001
//浮点数0 0000 0000 0000 0000 0000 0000 0001 001
// S=0 E=0-127=-127 M=1.0000 0000 0000 0000 0001 001 E不全为0或1的正常算法
// S=0 数很小 直接规定E=-126 默认小数点前为0 E=0.0000 0000 0000 0000 0001 001 E全0的特殊算法
float *pFloat = (float *)&n;
printf("n的值为%d\n", n); //9
printf("*pFloat的值为%f\n", *pFloat); //0.000000
*pFloat = -9.0;
//补码1001.0
//(-1)^0 * 1.001^3
//S=0 E=3+127=130 M=001...(补0凑齐23位)
//0 1000 0010 0010 0000 0000 0000 0000 000
printf("num的值为%d\n", n); //1,091,567,616
printf("*pFloat的值为%f\n", *pFloat); //9.0
return 0;

//总结 E不全为0或1 E=8位无符号数的真值 - 127 小数部分1.010101... 默认小数点前有1 M=010101...
// E全为0 阶码真值直接为-126 小数点前默认为0
// E全为1 阶码E=127+128 =255
}