char的取值范围
char分为signed char 和 unsigned char 两种类型
先说signed char(即char)的取值范围,什么是signed char呢?即有符号的char
我们知道一个char在内存中占据一个字节,即八个比特位。用二进制表示char的取值范围就是00000000--11111111。那么你是否认为signed char的类型就是0--255呢?
如果你这样认为那么你就错辣!实际上,signed char的取值范围是-128--127。
为什么会这样呢?
所谓有符合数,就是指他的码的最低位(最左侧位)会被当作符号位,不进行计算。
举个例子,像是10000010,因为它是有符号数,最左侧的1会被当作符号位,表示负且不计算值的大小(如果是0则表示正),
因此10000010表示-2而不是130。最低位是否被当作符号位,这就是有符号数和无符号数之间的显著差别。
signed char 00000000至01111111表示0--127
10000000至11111111表示-127-0
等等,这样的话signed char的范围不就是-127--127了吗?!
笔者查了查资料,解释如下:
在signed char中,0有两种表示方式即00000000和10000000(这样的话只能表示-127--127这255个数字)。而signed char有8个比特位,可以表示256个数字,因此C语音规定(乌龟的屁股!)10000000表示-128。
signed char的取值范围分析完毕,而后再说unsigned char即无符号字符
前面已经提到,有符合型和无符号型间的显著区别就是最低位(最左侧位)是否被当作符号位。
unsigned char的取值范围同样也是00000000--11111111。这次就可以肆无忌惮地计算了,它的每一位都要参与计算,无需关心符号位的问题了。因此unsigned char的取值范围是0--255.
关于二维数组
有监控窗口可知,
arr[0]代表了第一行的所有元素,是int[4]类型(但它又是首元素地址)
arr[0]代表了第二行的所有元素,是int[4]类型
arr[0]代表了第三行的所有元素,是int[4]类型
arr+0代表了第一行首元素地址,是int[4]*
arr+1代表了第二行首元素地址,是int[4]*
arr+2代表了第三行首元素地址,是int[4]*
arr[0]+1 这个1,加的是int 类型大小
关于联合体
用Union判断机器的大小端
union s { char a; int b; }; int main() { union s s1; s1.b = 1; if (s1.a == 1) printf("小端\n"); else printf("大端\n"); return 0; }
1的十六进制序列
高位-->低位
0x 00 00 00 01
1在内存种的存储
地址:低地址-->高地址
小端 01 00 00 00
大端 00 00 00 01
Union的大小计算
union s { char a[9]; int b; }s1; int main() { printf("%d", sizeof(s1)); }
输出的结果是:12
如何计算的?
- union的大小不小于成员大小的最大值
- union的大小必须是最大对齐数的整数倍
以上题为例,成员最大大小是9个字节,最大对齐数是4.因此union的大小是12.
union嵌套union的大小
union k { char a[17];//17 1/8 double b;//8 8/8 }; union s { char a[9];//9 1/8 union k s2;//24 8/8 int b;///4 4/8 }s1; int main() { printf("%d", sizeof(s1)); }
输出结果是: 24
由于共用体所有成员是共用一块空间的,因此计算共用体的大小只用找到最大成员的大小,并确保它是最大对齐数(包括嵌套联合体成员的对齐数)的整数倍就可以了。