`
ChuanSu
  • 浏览: 53318 次
  • 性别: Icon_minigender_1
  • 来自: 石家庄
社区版块
存档分类
最新评论

C/C++, 类型转换 发生了什么?

阅读更多
C语言中,数据类型间的转换,主要体现在内存间的转换,或者可以说体现在 bit 的转换,数据类型在内存的中都是以 bit 的形式体现的。
C/C++
  • char   1 byte
  • short  2 bytes
  • int    4 bytes
  • long   4 bytes
  • float  4 bytes
  • double 8 bytes

来看几个简单的例子,就会明白数据类型在转换的时候究竟发生了什么。
char ch ='A';
short s = ch;
printf("%d",s);

在console中的结果是 65。

在内存中 variable ch 是这样存储的
                65               

在内存中,数据类型都是以二进制的形式存储的,所以当看到一个十进制的数字的时候,应该时刻想着强大的数字 2
65 = 64 +1 = 2^6+2^0
char ch 占1个byte
01000001

short s = ch; 这行代码发生了什么?首先我们知道short是占2个bytes
           
所以  char ch
01000001
short s             
0000000001000001

从上面表格可以看出 在将char ch赋值给 short s 时 只是将char ch的 8个bit copy到 short s 的低8位,而short s多余的8-bit 空间,就 just padded(填补)在这里由0填补.

再来看个例子,
int i = pow(2,23)+pow(2,21)+pow(2,14)+7;//2^23+2^21+2^14+7
short s = i;
printf("%d",s);

结果一定是 short s = 2^14+7.

上面之所以写成2的指数的形式,是为了方便书写2进制,来看下 int i 的存储形式
00000000101000000100000000000111

short s
0100000000000111

int 型 在内存中占32 bit 但是short 型只有16 bit的空间来储存,那么以16 bit的空间去存储32 bit 的 pattern, 显然不可以,所以在C/C++ 中,就简单的将int型的低位16位 copy到 short的16位 内存空间。至于高位16位没有发生移动。这个又叫做 bit pattern copy。
所有short s = 2^14+7。

再来看个简单的例子。
short s = -1;
int i = s;
printf("%d",i);

variable short s的存储形式 为
1111111111111111

注意,最高位的 1, 仅仅为一个 符号,sign,只起到标记+/-的作用。在http://chuansu.iteye.com/blog/1435150有详细的介绍,在这不多讲了。

当 evaluate int i = s;时, int i 的内存又是如何的?
11111111111111111111111111111111


在讲到第一个例子的时候,我们提到过,对于short 多余的8 bit的空间 用0填充了。
这里,因为int型 有32-bit的足够大的储存空间,所有根据bit pattern copy,就可以简单的将上面short s =-1的 16-bit copy到 int型的 32-bit储存空间,而不丢失信息。
如果和第一个例子一样,将剩余的16-bit都用0填充,那么对于int i的最高位,也就是标记位,为0,表示正数,这就不相符了。所以在C/C++中,就简单的将 short s最高位的sign 1 扩展到其余的16-bit. 这个就称作 sign extention。

最后看一道我们学校的 考试题
引用
What is the output of the following program (1P)
# include <stdio.h>

int main(void){

	unsigned char uc1 = 0x256;
	unsigned char uc2 = 12;
	printf("%d %d | %x %x\n",
			uc1,uc2,uc1,uc2);
	
	return 0;
}

16进制与2进制的相互转化一定要熟悉掌握
0x256
现转化2 -> 0010;
     5 -> 0101;
     6 -> 0110;
所以0x256 的 二进制形式为 0010 0101 0110。
由上面说到的 bit pattern copy 可以知道
unsigned char uc1 = 0x256. 只能将低8位 copy 到 char uc1的8位存储空间中。
所有 char uc1
01010110

然后转化为 10进制 就为 2^1+2^2+2^4+2^6 = 86; %d(10进制) uc1 = 86;
%x,是指 去掉0x的16进制数, uc1 = 86; 由10进制转化为16进制,以2进制为桥梁,
86 的二进制为0101 0110
然后每四个bit一组 分别转化16进制 0101 -> 2^0+2^2 = 5;
                             0110 -> 2^1+2^2 = 6;
所以86的16进制为 56。 %x uc1 = 56;

同理可得出 %d uc2 = 12; %x uc2 = C。

本文主要介绍了 在C/C++ 类型转化时发生了什么? int short char间的转化。
那么float double与 int或者 short 发生转化时又是怎样的?以及float double在内存中又是怎么存储的?

未完-待续。


分享到:
评论

相关推荐

    Java与C/C++的区别(转).

    C/C++中允许进行广泛的类型转换,包括隐式转换和显式转换,这使得程序员可以灵活地操纵不同类型的数据。然而,过度使用类型转换可能会导致类型错误,增加程序的复杂性。Java中对类型转换进行了严格的限制,只有在...

    使用Pro*C/C++ 开发嵌入式SQL程序

    2. **Pro*C/C++的预编译过程**:预编译器将源代码中的SQL语句转换为C/C++函数调用,同时生成一个头文件,包含了必要的类型定义和声明。预编译后的代码可以像普通C/C++程序一样编译和链接。 3. **连接数据库**:使用...

    C/C++编码规范

    - 避免隐式类型转换,使用显式类型转换。 - 使用`const`关键字来指定函数参数或成员不可修改。 - 避免使用`void*`,除非确实必要。 9. **测试**: - 编写单元测试,确保代码的正确性。 - 对关键功能进行性能...

    从缺陷中学习c++

    C/C++允许进行隐式和显式的类型转换,这对于实现某些功能很有帮助,但同时也隐藏着不少陷阱。不当的类型转换会导致数据丢失或者出现不可预料的行为。 **解决方案**:尽可能使用显式的类型转换,并确保转换前后数据...

    C++ 多种数据类型转换

    显式类型转换是程序员明确指定的转换,通常使用C-style强制类型转换 `(type)` 或 C++-style 类型转换函数 `static_cast`, `dynamic_cast`, `reinterpret_cast` 和 `const_cast`。下面我们将一一介绍: 1. **C-style...

    64学时C/C++语言练习

    在C/C++中,不同类型的数据进行运算时,会发生自动类型提升或显式类型转换。表达式 `a/b + c + 0.4` 中,`a` 和 `b` 分别为 `int` 和 `float` 类型,`c` 为 `char` 类型,而 `0.4` 是 `double` 类型。在进行加法运算...

    C/C++中常用的单词

    在C/C++中,“cast”是指将一种数据类型转换为另一种数据类型的过程。类型转换可以通过显式或隐式的方式来进行。 以上就是C/C++中一些常用词汇的含义及应用场景。这些术语不仅有助于提高编程技能,也是深入理解...

    Practical UML StateCharts in C/C++, Second Edition.pdf

    ### 实用UML状态图在C/C++中的应用——第二版 #### 一、引言与背景 在2009年出版的《实用UML状态图在C/C++中的应用——第二版》(以下简称本书)中,作者针对现代计算机系统特别是嵌入式系统的事件驱动特性,提供...

    C++Primer 类型转化

    在C++中,类型转换是一种常见的编程技术,用于将一种数据类型转换为另一种数据类型。这种转换可以在编译时或运行时发生,并且可以是隐式的(自动进行)或显式的(由程序员通过特定语法指定)。本篇笔记将详细介绍C++...

    C_C++问题总结

    3.12 两种常用的实现隐式类类型转换的方式是什么?如何避免隐式类 型转换?3.13 STL中的vector:增减元素对迭代器的影响 3.14 STL中排序算法的实现 3.15 C和C++的区别 3.16 内存对齐 3.17 C++转换机制(static_cast...

    C、C++函数集(速查).pdf

    标题:“C、C++函数集(速查).pdf”描述:“C、C++函数集(速查).pdf”标签:“技术及资料”内容:(2^exp)1.10atan1.11atan2x/yxxx/yx0.512^exp101.27powxy__isasciiASCII***.**.**.**.**.**.**.**.**.9_chgsign_...

    c/c++写的计算器(修正版)

    求余运算只适用于整数类型,因此在设计时需要考虑到数据类型的转换和边界检查,以防止除以零等错误情况的发生。在C/C++中,整数求余操作符%返回的是两整数相除后的余数,这对于编程中的某些特定应用场景,如模运算或...

    C_C++运算中数据类型隐含转换溢出分析

    - **基本类型转换**:在不同数据类型间进行运算时,C/C++会自动进行类型转换来确保运算的正确性。例如,在进行`int`和`float`类型的混合运算时,`int`会被转换成`float`后再进行运算。 - **构造类型转换**:在处理...

    C/C++ Coding Standard for IEC61508

    - 《标准》特别指出了C/C++语言中的一些特性可能带来不可预知的行为,如指针运算、类型转换等。 - 这些特性往往依赖于特定的上下文或编译器,可能导致程序的行为不符合预期。 - 为了避免这类问题,《标准》推荐...

    C++必知必会_c++类型转换_C++字符pdf_Vc_

    显式类型转换则是程序员主动进行的转换,主要有四种形式:C-style类型转换(static_cast, reinterpret_cast, const_cast 和 dynamic_cast)。其中,`static_cast`用于非多态类型的转换,如整型和浮点型之间的转换,...

    c/c++部分代码

    C/C++编程语言是计算机科学中的基础且至关重要的工具,它们被广泛应用于系统级编程、嵌入式系统、游戏开发等多个领域。C语言以其高效、灵活性和可移植性著称,而C++则是C语言的一个扩展,引入了面向对象编程的概念。...

Global site tag (gtag.js) - Google Analytics