c语言,数据类型转换

隐式类型转换规则:
  C语言自动转换不同类型的行为称之为隐式类型转换 ,转换的基本原则是:低精度类型向高精度类型转换,具体是:
  int -> unsigned int -> long -> unsigned long -> long long -> unsigned long long -> float -> double -> long double

  注意,上面的顺序并不一定适用于你的机器,比如当int和long具有相同字长时,unsigned int的精度就会比long的精度高(事实上大多数针对32机的编译器都是如此)。另外需要注意的一点是并没有将char和short型写入上式,原因是他们可以被提升到int也可能被提升到unsigned int。
  提升数据的精度通常是一个平滑无损害的过程,但是降低数据的精度可能导致真正的问题。原因很简单:一个较低精度的类型可能不够大,不能存放一个具有更高精度的完整的数据。一个1字节的char变量可以存放整数101但不能存放整数12345。当把浮点类型数据转换为整数类型时,他们被趋零截尾或舍入。
  强制类型转换:
  通常我们应该避免自动类型转换,当我们需要手动指定一个准确的数据类型时,我们可以用强制类型转换机制来达到我们的目的,使用方法很简单,在需要强制转换类型的变量或常量前面加上(type),例如(double)i; 即把变量 i 强制转换成double型。
---------------------------------------------------------------------------------------------
一个int型负数转换成一个unsigned int型数时为什么会变成一个很大的整数?这
这里涉及到整数的存储方式,整数的二进制有原码、反码、补码,
它在内存中的转换是:整形数据在内存中是以2进制数的补码存在的,
正数的原码、反码、补码都一样,而负数则不同,-3的原码是1000 0000 0000 0011(左边的第一个1表示符合位,1为负,0为正);反码是1111 1111 1111 1100(原码除符号位之外的所有为取反);补码是1111 1111 1111 1101(反码+1);输出时也按补码,所以最终二进制补码的值就是类型转换后的值,即b=65533(这是在TC2.0上的(16位))。

——————————————————————————————

开门见山,先来看一段简单的代码:

  1 #include <stdio.h>
  2
  3 int array[] = {1, 2, 3, 4, 5, 6, 7};
  4 #define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
  5
  6 int main()
  7 {
  8     int i = -1;
  9     int x;
 10
 11     if(i <= TOTAL_ELEMENTS - 2) {
 12         x = array[i + 1];
 13         printf("x = %d.\n", x);
 14     }
 15
 16     printf("now i = %d.\n", TOTAL_ELEMENTS);
 17
 18     return 0;
 19 }

执行结果:

[email protected]:~/C_Language$ ./a.out

now i = 7.

是不是很奇怪?为什么没有打出line13的x = ?。

是这样的。这个小例子有三点值得注意:

1.sizeof()是运算符,返回类型是无符号的,即非负数。

2.if语句在singned int和unsigned int之间进行判断语句,根据C语言的整型提升规则,如果原始类型的所有值都可用int类型表示,则其值将被转换为int类型;否则将被转换为unsigned int类型。因此此时的i将会被升级成无符号类型。

3.i = -1被升级为无符号型,值究竟是多少?这要用到整型转换规则:K&R上这样解释,将任何整数转换为某种指定的无符号数类型数的方法是:以该无符号数类型能够表示的最大值加1为摸,找出与此整数同余的最小的非负值。听着很拗口,其实说白了,只要知道原整数的二进制表达方法,再用要即将转换的类型去解析,就得到升级后的值了。 比如-1,负数在计算机里用补码表示,0xffffffff,那升级成无符号型之后,值就是0xffffffff,显然比TOTAL_ELEMENTS(7)大。

————————————————————————————

笔试题-c语言类型转换(2012.3.23面试)

C语言拾遗(一):整型提升

时间: 2024-10-21 13:10:27

c语言,数据类型转换的相关文章

C语言数据类型转换基本规则

     程序语句和表达式通常应该只使用一种类型的变量和常量,但是如果混合使用类型, C使用一个规则集合来完成数据类型的自动转换. 以下是一些C数据类型转换的基本规则: 1.当出现在表达式中时,有符号和无符号的char和short类型都将自动转换为int. 2.在包含两种数据类型的任何运算中,较低级别类型将会转为运算中另一个较高级别的数据类型. 3.数据类型级别从高到低的顺序是long double.double.float.usigned long long.long long unsigne

C语言数据类型转换

变量的数据类型是可以转换的.转换的方法有两种,一种是自动转换,一种是强制转换. 自动转换 自动转换发生在不同数据类型的量混合运算时,由编译系统自动完成.自动转换遵循以下规则: 若参与运算量的类型不同,则先转换成同一类型,然后进行运算. 转换按数据长度增加的方向进行,以保证精度不降低.如int型和long型运算时,先把int量转成long型后再进行运算. 所有的浮点运算都是以双精度进行的,即使仅含float单精度量运算的表达式,也要先转换成double型,再作运算. char型和short型参与运

数据类型转换-运算符

##基本数据类型转换 - 默认顺序是 * byte->short->int->long->float->double - 自动提升规则(针对二元操作符) * 所有的byte,short,char型会自动提升为int型 * 若一个操作数是long类型,则另一个操作数也会转换为long类型,计算的结果类型也是long类型 * float类型,double类型跟long类型的提升规则一样 - 注意 * 默认浮点型是double类型,默认整型是int类型 * 举例说明: ``` fl

Arduino中数据类型转换 int转换为char 亲测好使,itoa()函数

由于博主最近在做一个项目,需要采集不同传感器的数据,包括float型的HCHO,以及int型的PM2.5数据.但是最终向服务器上传的数据都得转换为char型才能发送,这是借鉴了一个github上面的实例实现了在Arduino上部署socket使之与服务器进行交互. github实例如下: https://github.com/washo4evr/Socket.io-v1.x-Library 在本项目中多次使用了数据类型转换,前文提到了float和double类型转换为char,如下:http:/

javaScript-数据类型和数据类型转换

特别声明,以下为达内科技web前端讲师张东张老师的原创笔记,未经允许,不可转于其他商用,仅供学习. 1. 什么是JavaScript:专门编写网页交互的语言 2. 什么变量:内存中存储*一个*数据的存储空间,再起一个名字 声明: 创建一个变量, var 变量名; 赋值: 将等号右边的数据保存到等号左边的变量中.变量名=值; 取值: 在任何位置使用变量名等效于直接使用变量中的值 特殊:1. 简写:var 变量名=值;——建议 ***2. 声明提前:在正式执行程序前,都会预读所有var声明的变量,集

2016.7.29 数据类型转换

js是弱类型语言,定义不像后台一样严格使用string.int.boolean等,而是直接一个var定义所有的对象. 玩数据类型转换之前,我们先讲讲各种数据的作用和形式. string     字符串 Number  数字 Boolean  布尔类型 NaN          数字类型,表示数字的空和错误 undefined 表示"缺少值",就是此处应该有一个值,但是还没有定义. undefined典型用法: (1)变量被声明了,但没有赋值时,就等于undefined. (2) 调用函

JavaScript之基础-3 JavaScript 数据类型、数据类型转换

一.数据类型 数据类型 基本类型 - 数字类型 - 既可以表示32位整数,也可以表示64位的浮点数 - 整数 - 十进制:逢十进一的整数,如1234567890 - 八进制:逢八进一的整数,如01235670 - 十六进制: - 浮点数 - 使用小数点记录数据,如 95.5,3.1415926 - 使用指数记录数据,如 4.3e23, 4.3E-23 string 类型 - 字符串类型 - 表示一系列的文本字符数据,如性别.姓名.住址等 - 由Unicode字符,数字,标点组成的序列 - Jav

数据类型回顾——数据类型转换(显式和隐式)—JS学习笔记2015-6-3(第47天)

对于JS这种语言来说,因为它是一种动态类型语言,变量是没有类型的,可以随时赋予任意值. 但是,数据本身和各种运算是有类型的,因此运算时变量需要转换类型. 大多数情况下,这种数据类型转换是自动的,但是有时也需要手动强制转换. 首先看下强制类型转换(显式) 之前提到的Namber.parseInt.parseFloat 都是强制类型转换: 这里在看阮一峰博客(http://javascript.ruanyifeng.com/grammar/conversion.html#toc1) Number方法

语法》第九章 数据类型转换

第二部分  语法 ************第九章 数据类型转换 *************** JavaScript 是一种动态类型语言,变量没有类型限制,可以随时赋予任意值. 虽然变量没有类型,但是数据本身和各种运算符对运算子是有类型要求的.如果运算符发现,数据的类型与预期不符,就会自动转换类型.比如,减法运算符预期两侧的运算子应该是数值,如果不是,就会自动将它们转为数值. JS有一套数据类型自动转换的规则 一.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数

Delphi 常见数据类型转换

不同的类有不同的成员,一般子类的成员是在父类的成员的后面增加了新的成员,如果子类转为父类,那这些新增加的成员虽然还存在,但是就不可以访问得到了.如果父类转为子类,那可能导致不可预知的错误,因为某个成员的指针指向的地址根本就不是具有实际成员.类型的转换也有很多类的,有隐性的和显性的,一些专用的类型转换函数,会重新建立一个新类型目标对象,然后把就类型的数值移动过去,然后销毁旧对象.一些隐性的转换,对象本身没改变,就把指针类型换一了一下.@用于取地址!最方便的用法:在调用Api的时候,举个例子:我们调