unsigned type 和 type的区别
unsigned int 和 int的区别,当我们用int定义一个变量时,实际上是在栈上申请了4B的空间,unsigned只是代表有符号还是没有符号,并不影响空间的大小,所以unsigned int 范围0~2³² = 0~ 0~4294967295,而int的范围是-2的16次~2的16次方 = -2147483648 ~ 2147483647。
至于INT_MAX和INT_MIN的定义
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX-1)
关于宏定义的面试: 复杂的宏定义的时候不要忘记括号;do{...}while(...)的好处;
16位、32位、64位对应的常用数据类型字节数
只用掌握不同的,其它的都一样。
(16位)int 2字节
(32位)int 4 字节
指针类型数据类型字节数:
(32位)char* 4 字节
(64位)char* 8 字节
(32位)long 4 字节
(64位)long 8 字节
用数据类型定义变量和用printf读取,用scanf写入
当我们使用int定义一个变量(或者别的数据类型),实际上是告诉编译器给我们申请4B的内存空间,我们要往其中存放数据。
printf、scanf函数中用到的格式符:
%d
%c
%s
%f 浮点数形式
%lf 长浮点数形式(double类型)
%o 八进制
%x 十六进制
(%X跟%x是输出十六进制数字,%X是输出的十以上的字母大写,%x是输出十以上的字母小写)
%u
%e 科学计数法输出
%g %f或者%e中宽度较短的一种输出
%p 打印地址。打印一个变量或者指针的地址
第一个问题:当printf的变量和格式符不匹配?
有些不匹配可以的,因为发生了隐式转换,比如float类型数据输出int类型时,编译器会提示你警告(数据丢失),还有的就是按照ascii值进行char类型到int,int到char之间的转换。
有的不匹配是不可以的,比如int数据按照%s打印,%s会一直向后寻找一个'\0'字符串结束符,但是一直找不到就发生了内存访问越界,导致程序崩溃。
第二个问题:当scanf的变量和格式符不匹配?
int a;
double b;
//同样输入的数字 a = 1000000000(11位,超过了4B内存的最大数值)
// b = 1000000000(11位)
scanf("%d",&a);
scanf("%lf",&b);
此时的结果,a提示错误,b是可以的。因为根据变量数据类型,在栈上分配了4B和8B的空间,当我们访问越界的时候,编译器会提醒我们发生了错误。