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
short s = ch; 这行代码发生了什么?首先我们知道short是占2个bytes
从上面表格可以看出 在将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 的存储形式
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 |
short s
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的存储形式 为
注意,最高位的 1, 仅仅为一个 符号,sign,只起到标记+/-的作用。在
http://chuansu.iteye.com/blog/1435150有详细的介绍,在这不多讲了。
当 evaluate int i = s;时, int i 的内存又是如何的?
1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
在讲到第一个例子的时候,我们提到过,对于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
然后转化为 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在内存中又是怎么存储的?
未完-待续。
分享到:
相关推荐
C/C++中允许进行广泛的类型转换,包括隐式转换和显式转换,这使得程序员可以灵活地操纵不同类型的数据。然而,过度使用类型转换可能会导致类型错误,增加程序的复杂性。Java中对类型转换进行了严格的限制,只有在...
2. **Pro*C/C++的预编译过程**:预编译器将源代码中的SQL语句转换为C/C++函数调用,同时生成一个头文件,包含了必要的类型定义和声明。预编译后的代码可以像普通C/C++程序一样编译和链接。 3. **连接数据库**:使用...
- 避免隐式类型转换,使用显式类型转换。 - 使用`const`关键字来指定函数参数或成员不可修改。 - 避免使用`void*`,除非确实必要。 9. **测试**: - 编写单元测试,确保代码的正确性。 - 对关键功能进行性能...
C/C++允许进行隐式和显式的类型转换,这对于实现某些功能很有帮助,但同时也隐藏着不少陷阱。不当的类型转换会导致数据丢失或者出现不可预料的行为。 **解决方案**:尽可能使用显式的类型转换,并确保转换前后数据...
显式类型转换是程序员明确指定的转换,通常使用C-style强制类型转换 `(type)` 或 C++-style 类型转换函数 `static_cast`, `dynamic_cast`, `reinterpret_cast` 和 `const_cast`。下面我们将一一介绍: 1. **C-style...
在C/C++中,不同类型的数据进行运算时,会发生自动类型提升或显式类型转换。表达式 `a/b + c + 0.4` 中,`a` 和 `b` 分别为 `int` 和 `float` 类型,`c` 为 `char` 类型,而 `0.4` 是 `double` 类型。在进行加法运算...
在C/C++中,“cast”是指将一种数据类型转换为另一种数据类型的过程。类型转换可以通过显式或隐式的方式来进行。 以上就是C/C++中一些常用词汇的含义及应用场景。这些术语不仅有助于提高编程技能,也是深入理解...
### 实用UML状态图在C/C++中的应用——第二版 #### 一、引言与背景 在2009年出版的《实用UML状态图在C/C++中的应用——第二版》(以下简称本书)中,作者针对现代计算机系统特别是嵌入式系统的事件驱动特性,提供...
在C++中,类型转换是一种常见的编程技术,用于将一种数据类型转换为另一种数据类型。这种转换可以在编译时或运行时发生,并且可以是隐式的(自动进行)或显式的(由程序员通过特定语法指定)。本篇笔记将详细介绍C++...
`extern "C"`是一个C++的关键字,用于指定链接规范为C风格,这对于在C++程序中调用C语言库或其他C++编译单元非常重要。 **关键知识点:** - **`extern "C"`的基本概念**:解释了为什么在C++中需要使用`extern "C"`...
- **void指针与类型转换**:讨论如何安全地使用`void *`指针进行类型转换。 #### 8. C/C++语言可变参数表深层探索 - **可变参数函数的实现**:介绍如何使用`va_list`、`va_start`、`va_end`等宏来实现可变参数函数...
标题:“C、C++函数集(速查).pdf”描述:“C、C++函数集(速查).pdf”标签:“技术及资料”内容:(2^exp)1.10atan1.11atan2x/yxxx/yx0.512^exp101.27powxy__isasciiASCII***.**.**.**.**.**.**.**.**.9_chgsign_...
3.12 两种常用的实现隐式类类型转换的方式是什么?如何避免隐式类 型转换?3.13 STL中的vector:增减元素对迭代器的影响 3.14 STL中排序算法的实现 3.15 C和C++的区别 3.16 内存对齐 3.17 C++转换机制(static_cast...
求余运算只适用于整数类型,因此在设计时需要考虑到数据类型的转换和边界检查,以防止除以零等错误情况的发生。在C/C++中,整数求余操作符%返回的是两整数相除后的余数,这对于编程中的某些特定应用场景,如模运算或...
- **基本类型转换**:在不同数据类型间进行运算时,C/C++会自动进行类型转换来确保运算的正确性。例如,在进行`int`和`float`类型的混合运算时,`int`会被转换成`float`后再进行运算。 - **构造类型转换**:在处理...
- 《标准》特别指出了C/C++语言中的一些特性可能带来不可预知的行为,如指针运算、类型转换等。 - 这些特性往往依赖于特定的上下文或编译器,可能导致程序的行为不符合预期。 - 为了避免这类问题,《标准》推荐...
显式类型转换则是程序员主动进行的转换,主要有四种形式:C-style类型转换(static_cast, reinterpret_cast, const_cast 和 dynamic_cast)。其中,`static_cast`用于非多态类型的转换,如整型和浮点型之间的转换,...
在编译前,Pro*C/C++ 首先通过预处理器对源代码进行处理,将 SQL 语句转换成等效的 C 或 C++ 代码。这一过程涉及到对 SQL 语法的解析以及生成相应的调用库函数的代码。 #### 2.2 编译阶段 经过预处理后的代码会被...
C/C++编程语言是计算机科学中的基础且至关重要的工具,它们被广泛应用于系统级编程、嵌入式系统、游戏开发等多个领域。C语言以其高效、灵活性和可移植性著称,而C++则是C语言的一个扩展,引入了面向对象编程的概念。...
使用时需要进行显式类型转换。 #### 7. C/C++语言可变参数表深层探索 - **可变参数列表**:C/C++支持函数具有不确定数量的参数,这通常通过使用`va_list`、`va_start`、`va_end`和`va_arg`宏来实现。这种机制使得...