1.数据在内存中的存储
我们知道定义一个变量,会在内存中开辟空间存储,空间的大小是由变量的类型决定的,那么数据在所开辟内存中到底是如何存储的?
1.1原码、反码、补码
负数 从补码推原码有两种方式
第一种 补码减1 再按位取反 第二种 按位取反后+1
对于整型 数据在内存中的存储是补码
原因:
#include <stdio.h>
int main() {
int a = 10;//创建一个整型变量用4个字节来存储
int b = 20;
return 0;
}
变量a b在内存中的存储分别如下
10的十六进制为0000000a
由此我们可知 在内存中是倒着储存的
为什么会这样呢?
1.2大小端
如何判断大小端?
#include <stdio.h>
int main() {
int a = 1;
if (*(char*)&a == 1)
{
printf("小端\n");
}
else
printf("大端\n");
return 0;
}
short == signed short int=signed int
练习题
#include <stdio.h>
int main() {
char a = -1;
signed char b = -1;
unsigned char c = -1;
printf("%d\n %d\n %d\n", a, b, c);
return 0;
}
我们来分析一下是怎么回事
首先-1
原码 10000000000000000000000000000001
反码 1111111111111111111111111111111111110
补码 1111111111111111111111111111111111111
因为整型-1是32个比特位 char 是8个比特位发生截断
11111111
而%d是打印一个有符号的十进制数
要进行整型提升
有符号的用符号位补
补码11111111111111111111111111111111
原码1000000000000000000000000001
所以a 打印出来为-1
b同理
c
原码 10000000000000000000000000000001
反码 1111111111111111111111111111111111110
补码 1111111111111111111111111111111111111
截断
11111111
unsigned char 无符号整型提升用0
00000000000000000000000011111111
所以c为255
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n", a);
return 0;
}
%u是输出无符号的十进制数
-128
原码 10000000000000000000000010000000
反码 111111111111111111111111111101111111
补码111111111111111111111111111111000000
截断1000000
整型提升11111111111111111111111111000000
(因为char 是有符号位的所以补1)
输出结果为4294967168
如果是128呢?
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n", a);
return 0;
}
结果一样是为什么呢?
原码 00000000000000000000000010000000
反码 00000000000000000000000010000000
补码 00000000000000000000000010000000
截断10000000
整型提升 11111111111111111111111111000000
#include <stdio.h>
int main()
{
int i = -20;
unsigned int j = 10;
printf("%d\n", i + j);
return 0;
}
i 原码10000000000000000000000000010100
反码111111111111111111111111111111101011
补码111111111111111111111111111111101100
j 原码00000000000000000000000000001010
反码00000000000000000000000000001010
补码00000000000000000000000000001010
i 补码111111111111111111111111111111101100
i+j 111111111111111111111111111111110110
原码 00000000000000000000000000001010
所以输出结果为-10
是用补码参与运算
整型提升
高位补充符号位,
无符号整形提升,高位补0
#include <stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
}
printf("%d", strlen(a));
return 0;
}
为什么不是1000 是255?
是因为char的范围是-128-127
而strlen是统计\0之前的数字
所以为255
#include <stdio.h>
unsigned char i = 0;
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
}
return 0;
}
unsigned char 0-255 所以i<=255恒成立
所以死循环