zoukankan      html  css  js  c++  java
  • 第4课

    第4课 - 类型转换

    1. 类型之间的转换

    C语言的数据类型之间可以进行转换,包括以下两种:

    • 强制类型转换    ==>    程序员人为的将数据类型进行转换
    • 隐式类型转换    ==>    译器主动进行的数据类型转换

    【类型之间的转换】

     1 #include<stdio.h>
     2 
     3 int main()
     4 {
     5     long l = 800;
     6     int i = (int)l; // 强制类型转换
     7 
     8     short s = 800;
     9     int k = s;      // 隐式类型转换
    10 
    11     return 0;
    12 }

    2. 强制类型转换

    (1)强制类型转换的语法

            (Type)var_name

            (Type)value

    (2)强制类型转换的结果

      • 如果目标类型能够容纳目标值,那么结果不变
      • 如果目标类型不能容纳目标值,那么结果将产生截断

    (3)※注意:不是所有的强制类型转换都能成功,当不能进行强制类型转换时,编译器将产生错误信息

    【强制类型转换分析】

     1 #include <stdio.h>
     2 
     3 struct TS {
     4     int i;
     5     int j;
     6 };
     7 
     8 struct TS ts;
     9                                                                                                                                                                        
    10 int main()
    11 {
    12     short s = 0x1122;
    13 
    14     char c = (short)s;  // 目标类型不能容纳目标值,产生截断,取内存中的最后一个字节,0x22
    15 
    16     int i = (int)s;     // 目标类型能够容纳目标值,结果不变,0x1122
    17 
    18     int j = (int)3.1415;    // 浮点数和整型在内存中的表示方法不同,截断的方法就是舍弃小数部分,取整数部分
    19                             // 3
    20 
    21     unsigned int p = (unsigned int)&ts; // 在32位系统上指针为4字节,是可以的;在64位系统上指针为8字节,会产生截断
    22 
    23     //long l = (long)ts;   // 两种类型之间不能进行强制类型转换,编译报错   error: aggregate value used where an integer was expected
    24     // ts = (struct TS)l;  // 与上面相同,编译报错
    25    
    26     printf("s = 0x%x
    ", s);    // 0x1122
    27     printf("c = 0x%x
    ", c);    // 0x22
    28     printf("i = 0x%x
    ", i);    // 0x1122
    29     printf("j = 0x%x
    ", j);    // 0x3
    30     printf("p = 0x%x
    ", p);    // 0x601044
    31     printf("&ts = %p
    ", &ts);  // 0x601044
    32 
    33     return 0;
    34 }

    3. 隐式类型转换

    (1)隐式类型转换

     隐式类型转换是编译器主动进行的数据类型转换。 

    1 char c = 0;  // 变量c占用1个字节
    2 
    3 short s = c; // c到s -> 隐式类型转换
    4 int i = s;   // s到i -> 隐式类型转换
    5 long l = i;  // i到l -> 隐式类型转换

    ※注意:

      ① 低类型到高类型的隐式转换是安全的,不会产生截断  (高类型与低类型是相对的,比较的是占用内存的大小)

      ② 高类型到低类型的隐式转换是不安全的,导致不正确的结果

    (2)隐式类型转换的发生点  

      • 算术运算中,低类型转换为高类型
      • 赋值表达式中,表达式的值转换为左边变量的类型
      • 函数调用时,实参转换为形参的类型
      • 函数返回值,return表达式转换为返回值类型 

     标准C编译器的类型检查是比较宽松的,因此隐式类型转换可能带来意外的错误,写程序时需要时刻注意隐式类型转换!!! 

      

    【隐式类型转换分析】

     1 #include <stdio.h>
     2 
     3 int main()
     4 {
     5     char c = 'a';   // 97
     6 
     7     int i = c;  // 低类型==>高类型,安全
     8 
     9     unsigned int j = 0x11223344;
    10 
    11     short s = j; // 高类型==>低类型,不安全
    12  
    13     printf("c = %c
    ", c);      // ‘a’
    14     printf("i = %d
    ", i);      // 97
    15     printf("j = 0x%x
    ", j);    // 0x11223344
    16     printf("s = %x
    ", s);      // 0x3344
    17     printf("sizeof(c+s) = %d
    ", sizeof(c+s)); // char和short都会先转化为int,然后进行运算,结果为4
    18 
    19     return 0;
    20 }
  • 相关阅读:
    Docker多主机互联
    数据结构
    广度优先算法走出迷宫
    golang反射
    waitGroup的使用
    golang中的mutex锁
    goroutine和channel
    如何优雅的关闭Golang Channel?
    使用context关闭协程以及协程中的协程
    golang对不同系统的编译
  • 原文地址:https://www.cnblogs.com/shiwenjie/p/11853855.html
Copyright © 2011-2022 走看看