首页 > 代码库 > C语言的 (强制类型转换) 以及 '字符字面值'

C语言的 (强制类型转换) 以及 '字符字面值'

C语言的显式/隐式类型转换,都有一个中间变量的存在,原数据的类型、内容都不变。

 

以下代码,都用GCC编译。

 

 1 #include<stdio.h> 2  3 int main() 4 { 5     printf("%d %d\n", a, sizeof((int)a));    //输出为97,4.  sizeof的作用对象为一个int型中间变量 6      7     char c = 255; 8     printf("%d\n", c);    //输出-1.  char型的c已溢出,隐式转换为int后同样保持为-1 9 10     return 0;11 }

 

之前以为单引号多字符,比如‘123‘会报错,测试了一下才发现只会警告(GCC,代码里给出警告信息),能编译通过:

 1 #include <stdio.h> 2  3 int main() 4 { 5     printf("%d\n", 1        );  //输出49 6     printf("%d\n", 12       );  //输出12594       警告:warning: multi-character character constant 7     printf("%d\n", 123      );  //输出3224115     警告:同上 8     printf("%d\n", 1234     );  //输出825373492   警告:同上 9     printf("%d\n", 12345    );  //输出842216501       警告:warning: character constant too long for its type10     printf("%d\n", 123456   );  //输出859059510       警告:同上11     printf("%d\n", 1234567  );  //输出875902519       警告:同上12     printf("%d\n", 12345678 );  //输出892745528       警告:同上13     printf("%d\n", 123456789);  //输出909588537       警告:同上14 15     return 0;16 }

以上分别输出1~9个数字组成的字符字面值,输出类型为int型,中间有个隐式类型转换的过程。

第一行输出‘1‘的ASCII码值49;

第二行则将‘1‘和‘2‘的ASCII码值分别赋予int型中间变量的低位2个字节,即0x3132,所以输出为12594 = (49 << 8) + 50;警告信息提示为多字符字面值;

第三四行的结果原理同上;

第五行以下的,原理同上,但是只取低4位,例如第9行,只取‘6789‘,即0x36373839;警告信息提示字符字面值超出int类型的字节数。

 

C语言的 (强制类型转换) 以及 '字符字面值'