一.类型
0.类型修饰
a>基本数据类型修饰符
long,short,unsigned,signed
long,short,signed,unsigned的常见用法就是修饰int,但其实char也有unsigned,signed之分,测试一下,顺便检测溢出情况
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
signed char a = -100;
unsigned char b = -100;
char c = -100;
signed char aa = -300;
signed char bb = 300;
unsigned char cc = -300;
unsigned char dd = 300;
printf("signed char a %d\nunsigned char b %d\nchar c %d\n",a,b,c);
printf("signed char aa %d\nsigned char bb %d\nunsigned char cc %d\nunsigned char dd %d\n",aa,bb,cc,dd);
return 0;
}
输出情况
try.c:40:2: 警告: 隐式常量转换溢出 [-Woverflow]
try.c:41:2: 警告: 隐式常量转换溢出 [-Woverflow]
try.c:42:2: 警告: 大整数隐式截断为无符号类型 [-Woverflow]
try.c:43:2: 警告: 大整数隐式截断为无符号类型 [-Woverflow]
signed char a -100
unsigned char b 156
char c -100
signed char aa -44
signed char bb 44
unsigned char cc 212
unsigned char dd 44
可以看出char无修饰符默认signed,且signed负向溢出,符号位仍为负,同样,unsigned符号始终为正。
b>类型修饰符
auto, const, register, static, volatile, extern
auto:
申明一块临时的变量内存
若变量未申明,一般默认为auto,特殊之处在于C++11中,auto定义时可以默认识别基本类型
auto a = 1; //等同与 int a = 1;
auto b = 1.0; //等同与 float b = 1.0;
auto c = 'a'; //等同与 char c = 'a';
auto b = 1.0; //等同与 float b = 1.0;
auto c = 'a'; //等同与 char c = 'a';
但const的使用会有一些特殊之处,平时我们一般不会用到这么深,
const优先结合左边的类型,左边没有才去结合右边,如:
const int a = 0;
int const a = 0; //这两句等价
int const a = 0; //这两句等价
const int *pi = 0;
int const *pi = 0;//const都是修饰int
int const *pi = 0;//const都是修饰int