C语言中的类型转换

简介: C语言中的类型转换

隐式类型转换

整型提升

概念:

  • C语言的整型算术运算总是至少以缺省(默认)整型类型的精度来进行的
  • 为了获得这个精度,表达式中字符和短整型操作数在使用之前被转换为普通整型,这种转换成为整型提升

如何进行整型提升

  • %d是以十进制形式打印有符号整数,对字符和短整型进行整型提升时,高位补符号位
  • %u是以十进制形式打印无符号整数,对字符和短整型进行整型提升时,高位补0
  • 举个例子:
#include<stdio.h>
int main()
{
  char num_1 = 5;
  /*
    数字5是一个整型数据,在内存中的存储形式为:
    0000 0000 0000 0000 0000 0000 0000 0101
    由于要存入char型变量中,而char只有一个字节,因此要进行截断
    num_1 = 0000 0101
  */
  char num_2 = 127;
  /*
    数字127是一个整型数据,在内存中的存储形式为:
    0000 0000 0000 0000 0000 0000 0111 1111
    由于要存入char型变量中,而char只有一个字节,因此要进行截断
    num_1 = 0111 1111
  */
  char num_3 = num_1 + num_2;
  /*
    由于整型提升,字符型数据num_1, num_2在使用之前要提升为int型(高位补符号位0)
    num_1 = 0000 0000 0000 0000 0000 0000 0000 0101
    num_2 = 0000 0000 0000 0000 0000 0000 0111 1111
    num_3 = 0000 0000 0000 0000 0000 0000 1000 0100
    进行整形阶段
    num_3 = 1000 0100 
  */
  printf("num_3 = %d\n", num_3);
  /*
    %d是以十进制的形式打印有符号整数
    char num_3 = 1000 0100,符号位为1
    整型提升:  1111 1111 1111 1111 1111 1111 1000 0100
    补码转反码:1111 1111 1111 1111 1111 1111 1000 0011
    反码转原码:1000 0000 0000 0000 0000 0000 0111 1100 -> -124
  */
  return 0;
}
  • 下面两个例子也能说明整型提升的存在:
    Eg1:
#include<stdio.h>
int main()
{
  char num_1 = 0xb6;
  short num_2 = 0xb600;
  int num_3 = 0xb6000000;
  if (0xb6 == num_1)
    printf("num_1\n");
  /*
    num_1 = 1011 0110
    整型提升:1111 1111 1111 1111 1111 1111 1011 0110
    明显,与0xb6不相等
  */
  if (0xb600 == num_2)
    printf("num_2\n");
  /*
    num_2 = 1011 0110 0000 0000
    整型提升:1111 1111 1111 1111 1011 0110 0000 0000
    可见,与0xb600不相等
  */
  if (0xb6000000 == num_3)
    printf("num_3\n");
  /*
    num_3就是int型,不要整型提升,因此num_3即为0xb6000000
  */
  return 0;
}
Eg2:
#include<stdio.h>
int main()
{
  char num = 1;
  printf("sizeof(num) = %u\n", sizeof(num));
  printf("sizeof(+num) = %u\n", sizeof(+num));
  printf("sizeof(-num) = %u\n", sizeof(-num));
    //%u是以十进制的形式打印无符号整数,由于操作符sizeof的值一定是整数,因此用%u打印
  /*
    由于num参与了运算,因此要整型提升为int型 
  */
  return 0;
}

算术转换

  • 如果某个操作符的各个操作数属于不同的类型,那么除非其中的一个操作数的转换为另一个操作数的类型,否则操作就无法进行。下面的层次体系称为寻常算术转换
long double
double
float
unsigned long int
long int
unsigned int
int
//向上转换    
/*
    没有char和short类型,是因为在使用时char和short要先整型提升为int
*/
  • 例如执行程序:
int num_1 = 5;
float num_2 = 3.14;
float num_3 = num_1 + num_2;
  • num_1和num_2相加时,int要先转换为float类型,再和num_2相加


相关文章
|
8月前
|
程序员 编译器 C语言
『C语言进阶』隐式类型转换规则
『C语言进阶』隐式类型转换规则
|
8月前
|
安全 程序员 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(下)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
62 5
|
8月前
|
设计模式 编译器 Linux
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(中)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
49 0
|
8月前
|
安全 编译器 C语言
从C语言到C++_37(特殊类设计和C++类型转换)单例模式(上)
从C语言到C++_37(特殊类设计和C++类型转换)单例模式
49 0
|
存储 C语言
C语言入门(2)——数据类型、运算符、类型转换、控制语句
char short int long flout(默认保存小数点后6位,并且可以四舍五入) double 输出int类型的值%d 输出字符用%c 输出long用%ld 输出float用%f 输出double用%lf
146 0
|
8月前
|
存储 物联网 编译器
详解【C语言】类型转换--整型提升,算术
详解【C语言】类型转换--整型提升,算术
126 0
|
8月前
|
存储 编译器 C语言
C 语言:类型转换与常量的细致理解
有时,您必须将一种数据类型的值转换为另一种类型。这称为类型转换
157 0
|
编译器 C语言 C++
09 C++ - 更严格的类型转换(比较C语言)
09 C++ - 更严格的类型转换(比较C语言)
48 0
|
存储 程序员 编译器
【C语言】你不知道的隐式类型转换规则
本文接着C语言中的操作符(万字详解)讲解隐式类型转换规则,还有没学操作符的老铁可以回头看看。 在 C 语言中,类型转换的方式一般可分为隐式类型转换和显示类型转换(也称为强制类型转换)。 其中隐式类型转换由编译器自动进行,不需要程序员干预。 隐式类型转换通常有两种情况:整形提升和算术转换。
462 0
|
存储 编译器 C语言
【C语言初阶】表达式求值(隐式类型转换,算术转换)
目录 表达式求值 一、先补充一点(为下文做准备) 1.首先,要了解原码、反码、补码(简单说一下) 2.有符号(signed)与无符号(unsigned)的区别 二、隐式类型转换(整型提升) 1.什么是整型提升? 2.整型提升的意义 3.有符号(signed)类型的整型提升 3.无符号(unsigned)整形提升 4.简而言之 5.例子 三、算术转换 四、
249 0
【C语言初阶】表达式求值(隐式类型转换,算术转换)