1.4变量和数据类型进阶
有符号整数和无符号整数
- short、int、long、long long类型的变量,可以表示正数,也可以表示负数,称为有符号的整数类型。
- unsigned short、unsigned int、unsigned long、unsigned long long类型的变量,只会被看作非负数,称为无符号的整数类型。
有符号整数的表示方式
- 将最左边的位(最高位)看作“符号位”。 符号位为0,则表示是非负数,其绝对值就是除符号位以外的部分; 符号位为1,则表示是负数,其绝对值是所有位取反(0变1,1变0)后再加1。
- 将一个负整数表示为二进制的方法:
- 设置符号位为1
- 其余位等于绝对值取反再加1 。
| 整数 | 表示成short时的二进制形式 | 十六进制形式 | | 0 | 0000 0000 0000 0000 | 0000 | | 1 | 0000 0000 0000 0001 | 0001 | | 257 | 0000 0001 0000 0001 | 0101 | | 32767 | 0111 1111 1111 1111 | 7FFF | | -32768 | 1000 0000 0000 0000 | 8000 | | -1 | 1111 1111 1111 1111 | FFFF | | -2 | 1111 1111 1111 1110 | FFFE | | -257 | 1111 1110 1111 1111 | FEFF |
数据类型的自动转换
- 有些不同的数据类型之间是相容的,可以互相赋值,这叫数据类型的自动转换
int a = 11.34; // 11.34被自动截取小数部分,转换为11后赋值给aint b = 30;double d = b; // d的值是30.0
字符类型到整型的互相转换
- 字符型数据可以转换成整型数据
int k = 'a'; //k的内容变为'a'的ASCII码,即97printf("%d", k); //输出:97
- 整型数据也可以转换为字符型数据,但只会留下最右边的那个字节(第0位到第7位),其他字节被丢弃
int n = 98;char k = n; //k的内容变为98,98时字符'b'的ASCII码printf("%c", k); //输出:b
类型自动转换示例
#include#include using namespace std;int main(){I int n1 = 1378; //1378的十六进制形式是 0x562 short n2; char c = 'a'; double d1 = 7.809; double d2; n2 = c+1; //n2变为98,97是'a'的ASCII码 printf("c=%c, n2=%d\n", c, n2); //输出 c=a, n2=98 c = n1; printf("c=%c, n1=%d\n", c, n1); //输出:c=b, n1=1378 n1 = d1; //d1=7.808,去掉小数部分后赋值给n1,n1变为7 printf("n1=%d\n", n1); // 输出 n1=7 d2 = n1; // d2变为7 printf("d2=%f\n", d2); //输出 d2=7.000000 return 0;}/* Output:c=a, n2=98c=b, n1=1378n1=7d2=7.000000*/