【C语言笔记】C语言数据类型转换

这篇具有很好参考价值的文章主要介绍了【C语言笔记】C语言数据类型转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


C语言中有很多数据类型,这些数据类型在内存中的存储形式不一样,为了计算方便,编译器不得不将某一种数据类型转换成另一种数据类型。本篇将介绍C语言中各种数据类型转换的规则。

一、自动类型转换(隐式转换)

自动类型转换指的是编译器在编译时自动的、隐式的进行的类型转换。

1、赋值时的类型转换

将一种类型的数据赋值给另一种类型的数据时,就会发生自动类型转换,例如:

double d = 5;

5是int类型的数据,而d是double类型的数据,在赋值时就会先把5转换成double类型的数据再赋值给d。
当然,把变量赋值给变量也会发生类型转换,例如:

float f = d;

编译器会把d先转换float类型的数据再赋值给f。

2、整形提升

整形提升是指再做整形运算时,把短整型(short)或字符整形(char)提升为缺省整形(int)再进行运算的一种机制。
下面这段引文说明了整形提升的意义:

表达式的整型运算要在CPU的相应运算器件内执行,CPU内整型运算器(ALU)的操作数的字节长度
一般就是int的字节长度,同时也是CPU的通用寄存器的长度。
因此,即使两个char类型的相加,在CPU执行时实际上也要先转换为CPU内整型操作数的标准长
度。
通用CPU(general-purpose CPU)是难以直接实现两个8比特字节直接相加运算(虽然机器指令
中可能有这种字节相加指令)。所以,表达式中各种长度可能小于int长度的整型值,都必须先转
换为int或unsigned int,然后才能送入CPU去执行运算。

也就是说,整形数据只要参与运算就都会被提升为int类型。

整形提升的规则:
整形提升是按照变量的数据类型的符号位类提升的,提升的时候高位补的是符号位,例如:

char ch = 3;
int n = ch; // 要将ch赋值给n,就要进行整形提升
// 内存中的ch:
// 00000011
// ch是有符号char所以高位补的是符号位0
// 00000000 00000000 00000000 00000011
// 所以赋给n的就是:
// 00000000 00000000 00000000 00000011

再例如:

char ch = -3;
int n = ch; // 要将ch赋值给n,就要进行整形提升
// 内存中的ch(补码):
// 11111101
// ch是有符号char所以高位补的是符号位1
// 11111111 11111111 11111111 11111101
// 所以赋给n的就是:
// 11111111 11111111 11111111 11111101

对于无符号整型,高位统一补0:

unsigned char ch = 128;
int n = ch; 
// 内存中的ch:
// 10000000
// ch是无符号的char,所以高位补0,不再是1
// 00000000 00000000 00000000 10000000 
// 所以赋给n的就是:
// 00000000 00000000 00000000 10000000 

3、算数转换

许多操作符的操作数不止一个,这些操作数在进行运算的时候如果不统一类型,运算将无法进行,那么在不同类型的数据进行运算时,必须将一个类型的数据转换成另一个类型的数据,这就是算数转换。
算数转换一般都是向着精度更高,长度更长的类型转换,所以就有了下面这些顺序:

long double
double
float
unsigned long int
long int
unsigned int 
int

以上类型从上至下排名较低的在运算时就要先转换成另外一个操作数。

二、强制类型转换

强制类型转换就是由程序员控制的,将一种类型转换成另一种数据类型的类型转换。

1、强制类型转换的规则

强制类型转换的语法格式为:

(type_name)exp

type_name为新类型名称,exp为表达式。就比如:

double d = (double)5;

5是int类型数据,强将5转换成double类型数据再赋值给d。

这里有一个示例:

#include <stdio.h>
int main() {
	int a = 3;
	int b = 6;
	int avg1 = 0;
	double avg2 = 0;
	avg1 = (a + b) / 2;
	avg2 = (double)(a + b) / 2;
	printf("%d, %.2lf", avg1, avg2); // 运行结果:4,  4.50
	return 0;
}

在计算avg1时,(a + b) 和2都是int类型,那结果自然也是int类型,在计算avg2时候,(a + b) 先被转换成了double类型,而后为了运算正确,又要将ine类型的2进行算术转换成double类型,所以算出的结果是double类型,正确的赋值给了avg2。

2、类型转换只是临时的

我们需要注意的是,不论是自动类型转换还是强制类型转换,都只是为了本次运算正确而临时进行的,不会对原来的数据进行更改,转换后的数据也只是被临时储存了起来。
请看下面这个示例说明:

#include <stdio.h>
int main() {
	int a = 10;
	int b = 3;
	double c = (double)a;
	printf("%d, %d\n", sizeof(a), sizeof(c)); // 运行结果: 4, 8
	//强制类型转换之后a的长度还是4,说明a本身并没有转换成double类型
	double sum = (double)a / b;
	printf("%.2lf\n", sum); // 运行结果:3.33
	printf("%d\n", sizeof(b)); // 运行结果: 4
	// 在计算时,为了正确b会被自动类型转换成double类型,但过后b的类型还是int,
	// 这说明自动类型转换也是临时的
	return 0;
}

一、类型转换的规则

不管是自动类型转换还是强制类型转换,都遵循着一些统一的规则。

1、有符号整形和无符号整形之间的转换

1)、如果有符号整形和无符号整型的位数相同,如果有符号整形不是负数,则它的数值不会发生改变.
2)、如果无符号整型的位数较大,则先将有符号整形提升为与无符号整型位数相同的有符号整形。然后再与无符号整数的最大数+1得到值相加,将有符号整形转换成无符号整型。
3)、如果无符号的位数较小,则除以“无符号数最大值+1”,将有符号整形转换成无符号整型。

2、浮点型和整形之间的转换

1)、将浮点型数据转换成整形数据时,会截断小数部分,只保留整数部分。
2)、将整形数据转换成浮点项数据时,如果转换后的结果在数值范围内不能被正确表示,则编译器会根据自己的方法取大于或小于的最接近的近似值作为转换结果。

3、浮点型和浮点型之间的转换

1)、float类型提升为double类型或long double或者double类型提升为long double是,数值不会发生变换。
2)、double类型转换成float类型或者long double转换成float类型时,会根据编译器自己定义的方法取大于或小于原值的近似值作为转换结果。文章来源地址https://www.toymoban.com/news/detail-787190.html

到了这里,关于【C语言笔记】C语言数据类型转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python教程 入门学习笔记 第6天 数据类型转换 字符串转换成数值 数值之间互转 其它类型转字符串

    s1=\\\"188\\\" #字符串 ns1=int(s1) #转换成整型数值 print(ns1+8) #打印数值结果 s1=\\\"3.14\\\" #字符串 ns1=float(s1) #转换成浮点型数值 print(ns1+3) #打印数值结果(数值结果为6.140000000000001,出现误差,后面讲解决办法) print(type(ns1)) #获取新数值的数据类型属性 z1=78 nz1=float(z1) print(nz1) #打印结果

    2024年02月14日
    浏览(46)
  • 【C++航海王:追寻罗杰的编程之路】C++的类型转换

    目录 1 - C语言中的类型转换 2 - 为什么C++需要四种类型转换 3 - C++强制类型转换 3.1 - static_cast 3.2 - reinterpret_cast 3.3 - const_cast 3.4 - dynamic_cast 4 - RTTI 在C语言中,如果 赋值运算符左右两侧类型不同,或者形参与实参类型不匹配,或者返回值类型与接收返回值类型不一致时,就需

    2024年04月13日
    浏览(24)
  • 最新最全面的Spring详解(三)——Resources,验证、数据绑定和类型转换与Spring表达式语言(SpEL)

    本文为 【Spring】Resources与Spring表达式语言(SpEL) 等相关知识,下边将对 Resources (包含: Resource接口 、 内置的 Resource的实现 、 ResourceLoader接口 、 应用环境和资源路径 ), 验证、数据绑定和类型转换 (包含: BeanWrapper 、 PropertyEditor属性编辑器 、 类型转换 、 配置 DataB

    2023年04月26日
    浏览(35)
  • Linux C语言开发(二)C语言数据类型

    目录 一.C语言概述 1.1 什么是C语言 1.2 C语言与Linux 1.3 C语言的特点 二.数据类型

    2024年01月17日
    浏览(27)
  • 以太坊智能合约开发:Solidity 语言中的数据类型

    本文我们介绍Solidity语言的数据类型,重点是值类型,包括布尔类型、整型、地址类型、字节类型、字符串类型和枚举类型。并且通过两个智能合约例子,用于演示这些数据类型的声明与使用方法。 访问 Github 仓库 获取更多资料。 Solidity中关于数据类型的定义如下: Solidity是

    2024年02月02日
    浏览(51)
  • C语言——类型转换

    数据有不同的类型,不同类型数据之间进行混合运算时涉及到类型的转换问题。 转换的方法有两种: 自动转换(隐式转换):遵循一定的规则,由编译系统自动完成 强制类型转换:把表达式的运算结果强制转换成所需的数据类型 语法格式: (类型)变量或常量 类型转换的原则:

    2024年02月11日
    浏览(23)
  • C语言强制类型转换

    C语言中的强制类型转换是指将一种数据类型转换为另一种数据类型的过程。强制类型转换可以显式地将一个数值从一种数据类型转换为另一种数据类型,但是需要注意的是,该转换可能会导致数据精度的丢失。下面是C语言中强制类型转换的实际代码示例: 在上述代码示例中

    2024年02月04日
    浏览(29)
  • C语言(强制类型转换)

    创作内容不易,学习的朋友麻烦关注下博主,后面学习不迷路。有不会的问题也可以论坛咨询博主,博主也会及时回复~~ 一.类型转换原则 1.升级:当类型转换出现在表达式时,无论时unsigned还是signed的char和short都会被自动转换成int,如有必要会被转换成unsigned int(如果short与

    2024年02月16日
    浏览(24)
  • C语言——函数指针类型转换

    昨天为了避免跨层调用API搞了个回调函数,用了函数指针,因为参数类型的问题总是编译报错,今天就看了两篇博文学习学习,顺便做做笔记。 其实正常来讲只要把函数指针的参数个数、类型和返回值这些函数指针的标签或者说是属性写对了的话就不会有社么问题,但我也不

    2024年01月16日
    浏览(24)
  • 【C#学习笔记】类型转换

    我们简单地将值类型分为5种:整数型,浮点型,布尔型,字符型,再加上一个本属于引用类型的字符串。 由于 C# 是在编译时静态类型化的,因此变量在声明后就无法再次声明,或无法分配另一种类型的值,除非该类型可以隐式转换为变量的类型。 隐式转换 :由于这种转换

    2024年02月14日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包