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 type
10     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语言的 (强制类型转换) 以及 '字符字面值'

时间: 2024-10-12 08:06:59

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

C语言之强制类型转换与指针--#define DIR *((volatile unsigned int *) 0x0022)

强制类型转换形式:(类型说明符) (表达式) 举例说明:1) int a; a = (int)1.9; 2)char *b; int *p; p = (int *) b; //将b的值强制转换为指向整型数据的指针类型,后赋给p 注示:类型说明符和表达式都必须加括号,表达式为单个变量可不加括号. 总结:只要看到(类型说明符) (表达式) 的一定为强制类型转换:如(int *) 0x0022; 再举一例:#define DIR *((volatile unsigned int *) 0x0022)

C语言的强制类型转换

1.什么是强制类型转换:遇到一些类型不同的一些数据之间的表达运算 ,需要将较高的数据类型转换成较低类型时. 2.强制类型的形式: (强制转换的类型)(表达式): 2.强制类型的使用: float a,b; int  c ; c=(int) (a+b);

C++强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

1. c强制转换与c++强制转换 c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cast,主要运用于继承关系类间的强制转化,语法为: static_cast<new_type> (expression) dynam

C++四种强制类型转换关键字

C语言使用强制类型转换(Type Cast)很简单,不管什么类型的转换,形式都如下: TYPE b = (TYPE)a; c++提供了4种类型转换操作符来应对不同场合的应用. const_cast  static_cast dynamic_cast reinterpreter_cast 4种关键字的使用形式如下: TYPE b = static_cast(TYPE)(a) 1.const_cast 去掉类型的const或volatile属性 const SA ra ={1} ; //ra.i =

强制类型转换:static_cast、dynamic_cast、const_cast、reinterpret_cast

已剪辑自: https://www.cnblogs.com/chenyangchun/p/6795923.html ? ? 1. c强制转换与c++强制转换 ?c语言强制类型转换主要用于基础的数据类型间的转换,语法为: (type-id)expression//转换格式1 type-id(expression)//转换格式2 ? c++除了能使用c语言的强制类型转换外,还新增了四种强制类型转换:static_cast.dynamic_cast.const_cast.reinterpret_cas

C语言中将0到1000的浮点数用强制类型转换的方式生成一幅图像

搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001.然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子. 前几天写了一篇文章是在C语言

C语言系列之强制类型转换(一)

例子: #include <stdio.h> { char cChar;   //字符型变量 short int iShort; //短整型变量 int ilnt;           //整形变量 float fFloat=70000;      //单精度浮点型 cChar=(char)fFloat;     //强制转换赋值 iShort=(short)fFloat;    // ilnt=(int)fFloat;           // printf("the char i

关于强制类型转换(c语言)

因为今天看的代码中用到了结构体的强制类型转换,就很想了解一下结构体的强制类型转换是怎样的. 一个结构体如下: 在下面这段代码中rbuf->reqCmdBuf是一个空指针,首先将这个空指针赋值给一个uint8_t类型的指针buf. 然后将buf指针强制类型转换为rdma_write_msg_head结构体类型指针. 那再这里是怎么转换的呢? 首先,将buf指针指向的内容的前8个字节赋值给rdma_write_msg_head结构体的rwmh->len变量,然后再 将紧接着的1个字节的内容赋值给r

15 Java语言基础数据类型转换之强制转换

public class Add{ public static void main(String[] args) { int x = 3; byte y = 4; y = (byte)(x + y); System.out.println(y); } } 大类型赋值给小类型,需要使用强制类型转换,强制类型转换可能会损失精度 强制类型转换的格式 小类型 小类型标识符 = (大类型) 大类型数值