int main()
{
int a[4] = { 1, 2, 3, 4 };
int* p1 = (int*)(&a + 1);
int* p2 = (int*)((int)a + 1);
printf("%x %x", p1[-1], *p2);
return 0;
}
X86环境下运行
%x打印16进制。
整形指针+1跳过四个字节,((int)a + 1)强制类型转换为整形数字了,这里的(int)a + 1就是数字+1,(int*)((int)a + 1);再强制转换成指针,总的来说就是跳过了一个字节,又根据小端储存的规则,
输出应为02000000(16进制)
这篇博客里详细讲解了数字在内存储存形式
整数和浮点数在内存中储存的形式-CSDN博客https://blog.csdn.net/bkmoo/article/details/136662463?spm=1001.2014.3001.5502
int main()
{
int n = 9;
float* pfloat = (float*)&n;
printf("n的值:%d\n", n);
printf("*pfloat的值:%f\n", *pfloat);
*pfloat = 9.0;
printf("n的值为:%d\n", n);
printf("*pfloat的值:%f\n", *pfloat);return 0;
}
根据整数与浮点数在二进制中储存的方式
int n = 9;
00000000000000000000000000001001(整数二进制储存)
float* pfloat = (float*)&n;
0 00000000 00000000000000000001001
E全为0。E的真实值为-127
无限接近于0
*pfloat = 9.0;
9 = 1001(二进制) = 1.001 * 2 ^ 3
s =- 0, E = 3, M = 1.001
0 10000010 00100000000000000000000(浮点数储存形式)
%d形式打印就是01000001000100000000000000000000
由于浮点型的特性,有些数字无法完全精确储存
因此,有了double(双精度)比float(单精度)精度更高。
无法精确储存会导致一些问题,在两个浮点数比较大小时,直接使用==可能不会出现想要的结果
例如 99.7,这里编译器只能储存接近于它的数而无法精确的储存99.7
直接用if( == 99.7)可能就不会运行。所以在比较时可优化为
if((a - 99.7)<=0.00001 || (a - 99.7) >= -0.00001)
或if ( abs(a - 99.7) <= 0.00001 ) , abs为绝对值函数。
int main()
{
char a = -128;
//二进制储存
//10000000000000000000000010000000原码
//11111111111111111111111101111111反码
//11111111111111111111111110000000补码
//因打印的是无符号整数
//打印时发生整形提升
printf("%u", a);//%u打印无符号整数
return 0;
}
int main()
{
char a[1000];
//char,占1个字节,8个bit位
//-128至127
int i = 0;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
//-1 -2 -3 ···-128 127 126 125 ···6 5 4 3 2 1 0 -1···
//当a = 0时,i = 128+127 = 255
printf("%d ", strlen(a));
return 0;
}
在这里为什么a的值是-1 -2 -3 ···-128 127 126 125 ···6 5 4 3 2 1 0 -1···
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
unsined char无符号char类型,取值范围为0-255
死循环