大小端储存
当有一个数值超过一个字节,储存到内存当中就有顺序的问题存在。就存在大段和小段两种储存方法。
大端储存模式:数据的低位储存在内存的高地址中,而数据的高位储存在内存的低地址中。
小端储存模式:数据的低位储存在内存的低地址中,而数据的高位储存在内存的高地址中。
我们常用的vs编译器就采用小端模式。
unsigned char c=-1 打印出来等于225。我们可以知道unsigned 并不是单纯的去掉数值符号。但是为什么会打印出225呢?
char 类型占一个字节也就是 00000000 有2^8个数值的容量。 数值在内存中的储存是补码所以signed char 和 unsigned char 的容量概念如下。
00000000 |
00000001 |
............. |
01111111 |
10000000 |
10000001 |
10000010 |
.............. |
11111110 |
11111111 |
signed char
signed char 补码的第一位是字符位,表现为0为正数,1为负数。 所以当转为原码输出时 补码10000001—>反码10000000—>原码11111111 转为十进制就是-127。而10000000认为规定为-128. signed char 的范围是127~-128
00000000 |
00000001 |
............. |
01111111 |
10000000 |
10000001 |
10000010 |
.............. |
11111110 |
11111111 |
unsigned char
unsigned char 没有符号位的概念所以 unsigned char的范围就是0~255
所以也就解释了 printf("%d",unsigned char c)是255了。