1.类型决定内存空间大小(大小决定了使用范围)
2.如何看待内存空间的视角
类型 | 大小(字节) |
short | 2 |
int | 4 |
long | 4 |
long | 8 |
类型 | 大小(字节) |
float | 4 |
double | 8 |
long double | 12 |
数组 | |
结构性 | struct |
联合 | union |
枚举 | enum |
void(表示空类型,无返回值)
直接将二进制转按照正负数的形式 换为二进制就可以
原原码符号位不变,其他位依次按位取反即可
反码+1即可·
int a=20;// 4字节 32bit
原码: 00010100(8个数表示20, 前面再加24个0)
补码,反码与 原码相同
int b=-10;//4字节 32bit
原码: 0000 1010(8个数表示10,前面加23个0,最前面符号位为1)
反码: 1111 0101(前面加23个1,最前面符号位为1)
补码: 1111(等于15) 0110(反码+1)
转换16进制位(4个2进制位转换为1个16进制位) 补码转换16进制:0x ffffff6
大端(存储): 指数据的低位保存在内存的高地址中,而数据的高位,保存在内存的低地址中
小端(存储): 指数据的低位保存在内存的低地址中,而数据的高位,保存在内存的高地址中
低地址: 编号小的
高地址 : 编号大的
如 0x 11 22 33 44
地址: 由低到高
数据: 由高到低
44为数据低位 , 11为数据高位
44为内存高地址 , 11为内存低地址
大端存储:11 22 33 44(人为)
小端存储:44 33 22 11(计算机)
//判断当前字节序:
//思路: 内存以16进制存储,如果第一个字节为 相对应16进制数,就为小端存储 ,否则为大端.
//比如 int a =1; 16进制为 01 00 00 00 (小端)
//利用 char* 来 访问一个字节的内容,指针类型决定访问几个字节的数.
//代码如下:
- int check()
- {
- int a=1;
- return *(char* )&a;
- // 取出a的地址,并把强制转换类型 为 char*(因为只需要访问字节),再解引用得到其中的数,并返回
- }
-
- int main()
- {
- //返回1,小端
- //返回0,大端
- int ret=check_sys();
- if(ret==1)
- {
- printf("小端");
- }
- else
- {
- printf("大端");
- }
-
- }
- main()
- {
- //数都为 -1,没赋值前补码都一致
-
- char a = -1;
- //原码:10000000000000000000000000000001
- //补码:11111111111111111111111111111111
- //输出为int.整形提升(按符号位补高位)
- //得补码:11111111111111111111111111111111(32)
- //为负数,原码输出还是 -1
-
- signed b = -1;
- //和a同理
-
- unsigned c = -1;
- //补码:111111111111111111111111 11111111
- //因为赋值类型为unsigned ,最高位为0,整形提升(按符号位补高位),
- //得新补码:0000000000000000000000 11111111(32)
- //此时为整数, 原反补码一致 为255
- printf("%d %d %d", a, b, c);
-
- }
- main()
-
- {
- //数都为 -1,没赋值前补码都一致
- char a = -128;
- //原码:100000000000000000000000 10000000
- //补码:111111111111111111111111 10000000
- //因为赋值类型为char.认为1为符号位(按符号位补高位)
- //得新补码:111111111111111111111111 10000000(32)
- //%u打印 打印十进制无符号数., 原反补码一致 为111111111111111111111111 10000000
- printf("%u", a);
-
- }
有符号 char范围 : -128------127
无符号 char范围: 0-------255
有符号字符类型范围图:
- main()
-
- {
-
- char a = 128;
- printf("%u", a);
-
- char b =- 128;
- printf("%u", b);
- //输出一致
- // a存不了128, 可以表示为 127+1=-128
-
-
- }
- int i=-20;
- unsigned j=10;
- printf("%d",i+j);
-
- //-20的 补码
- 11111111 11111111 11111111 11101100
-
- //10的 补码
- 000000 0000000 0000000 00001010
-
- 结果:
- 11111111 1111111 11111111 11111010 补码
- 11111111 1111111 11111111 11110110 反码
- 00000000 0000000 00000000 00001001 原码 -10
-
- unsigned int i;
- for(i=9;i>=0;i--)
- {
- printf("%d",i)
- }
-
- //无限循环
-
- //当循环到 -1 时,由于-1补码全为1, 赋值给i, i为 无符号数,修改最前面的1为0 ,将会变为一个超大的数.
- char a[1000];
- int i;
- for(i=0;i<1000;i++)
- {
- a[i] = -1 - i;
-
- }
- printf("%d", strlen(a));
-
- //参考上图 字符类型取值范围图,
- //当-1,-2.....到-128是,下一个数 为127,126,125.....,知道0,停止存储.
- //字符类型范围 -128到127
- unsigned char a[1000];
- int i;
- for(i=0;i<=255;i++)
- {
- printf("hello");
-
- }
-
- //无符号数 取值范围 0-255 , 当i为255+1 时, 将会变为 0,从而无限循环
基础知识:
不带任何后缀的浮点型变量 默认double , 以f(F).l(L) 分别表示 float 和 long double
float 表示 6个有效字符 , double 表示 15个 , long double 表示 18个.
浮点型 字面量,有且只有一个小数点,两侧至少一边有数字.
指数形式:
e(E)为底 为 十进制指数 如:2.87e-3 ,
以0x(0X)打头,p(P)分隔的 是以 2为底数的 16进制指数 如:0x2p3=16.0