关键字-sizeof
- 定义
用来确定一种类型对应在开辟空间的时候的大小(对内置字符和自定义数组是可求的)
注:不要将sizeof误认为函数,虽然sizeof带有(),但是sizeof是操作符,关键字
- 示例
int a=10; printf("%d\n", sizeof(a)); printf("%d\n", sizeof(int)); printf("%d\n", sizeof a);//这样写行不行? 可以 //得到的结果和sizeof(a)一致,说明sizeof并不是函数 printf("%d\n", sizeof int);//err 求类型大小必须带上()
- 与数组结合
int arr[3] = {1,2,3} sizeof(arr) 结果为12(arr表示整个数组) sizeof(arr+0)//或者sizeof(arr[0]) 结果为4(表示首元素地址) //所有的地址大小为4(32位平台)/8(64位平台)
关键字-signed\unsigned
有符号数vs无符号数
char //字符数据类型 unsigned char //signed(有符号)/unsigned(无符号) signed char //大多数编译器默认char为 signed char 即有符号类型(有的认为是unsigned char) //对于 short int long 都认为是有符号类型 short //短整型 unsigned short signed short int //整形 unsigned int signed int long //长整型 unsigned long signed long
整形在内存的存储
变量的创建会在内存中开辟空间,而空间的大小根据类型来决定
原码、反码、补码
数据的表示有原码、反码和补码三种方法,均有符号位和数值位
符号位都是用0表示“正”,用1表示“负”(符号位依旧符合二进制运算)
- 有符号数
- 正整数
原、反、补码都相同
- 负整数
原码:直接将二进制按照正负数的形式翻译成二进制就可以
反码:将原码的符号位不变,其他位依次按位取反就可以得到了
补码:反码+1就得到补码
- 无符号数
不需要转化,也不需要符号位,原反补相同
- 对于整形来说
数据存放内存中其实存放的是补码
而数据的读取是使用原码
- 示例:
//字面值转补码 int a = 20; //20是正整数 //原反补:0000 0000 0000 0000 0000 0000 0001 0100 int b = -10; //-10是正整数 //原:1000 0000 0000 0000 0000 0000 0000 1010 //反:1111 1111 1111 1111 1111 1111 1111 0101 //补:1111 1111 1111 1111 1111 1111 1111 0110
//补码转源码 方法一:先-1,在符号位不变,按位取反 方法二:将原码到补码的过程在来一遍
十进制和二进制转换
口诀:1后面跟n个0,就是2的n次方v