C/C++强制类型转换、指针类型转换发生了什么

(1)强制类型转换

强制类型转换是对变量对应的内存里面的0和1按照新的类型进行重新解释的过程

代码:

#include <iostream>
using namespace std;

int main(int, char *[])
{
	char c = 0xA0;//0xA0 [-128~127] 最高位为1表示负数  0xA0 = 1010 0000 = -96

	//高位补0 0xA0->0xFF FF FF A0 = 0000 0000 0000 0000 0000 0000 1010 0000 = 160
	printf("c = %d\n",c);

	//高位补1 0xA0->0xFF FF FF A0 = 1111 1111 1111 1111 1111 1111 1010 0000 = 4294967200
	cout<<"c = "<<(unsigned int)c<<endl;

	//0xA0,强制转换在赋值符号的左侧发生,这里将内存里的0和1按照强制转换之后的类型进行重新解释,
	//认为这段内存里面的0和1表示一个unsigned char,
	unsigned char uc = (unsigned char)c;//[0~256] 0xA0 = 1010 0000 = 2^7+2^5 = 128+32 = 160

	cout<<"uc = "<<(unsigned int)uc<<endl;//0xA0 = 0x00A0 ==(160)10进制
}

说明图片和运行结果

(2)指针类型转换

转换后指针变量的值(变量的地址)不变,转换后指针读写地址的时候发生变化:

a,读取变量的长度(字节数)按照转换后的变量大小读取(这里可能会越界访问!)

b,读取到的内容按照转换后的变量类型重新解释,同(1)

时间: 2024-10-29 03:40:10

C/C++强制类型转换、指针类型转换发生了什么的相关文章

不要伤害指针(7)--指针类型转换

当我们初始化一个指针或给一个指针赋值时,赋值号的左边是一个指针,赋值号的右边是一个指针表达式.在我们前面所举的例子中,绝大多数情况下,指针的类型和指针表达式的类型是一样的,指针所指向的类型和指针表达式所指向的类型是一样的. 例十五: float f = 12.3;float *fptr = &f;int *p; 在上面的例子中,假如我们想让指针p 指向实数f,应该怎么办?是用下面的语句吗? p = &f; 不对.因为指针p 的类型是int *,它指向的类型是int.表达式&f 的结

关于指针类型和指针类型转换的理解

id="mainContent"> 前几天在判断  "值相同的两个指针所指向的变量的值可以不同 "  这句话时,发现自己对指针类型一些概念仅仅是记住了结论.于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关的知识.  一些用到的 开始之前,先来复习一些会用到的知识. 1.地址,字节,位 位(bit)是电子计算机中最小的数据单位.每一位的状态只能是0或1. 字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit).

虚函数调用中的指针类型转换以及指针所指类型的本质

父类类型指针可指向子类对象,调用子类对象重写的虚函数,一条代码即有了不同的表现结果,也就是多态. 很显然,子类重写的虚函数里调用的自然是子类的成员变量,父类类型指针是无法直接访问到子类的成员变量的.那么既然是父类类型指针调用的子类的虚函数,那么传给this的自然就是父类类型的指针,那么又如何能访问到子类的成员变量呢? 细心想一下就明白了,this指针也是有类型的,其类型就是类本身类型,所以子类的虚函数中,this指针的类型就是子类类型,因此当父类类型的指针作为实参传进去时,会强制转换成子类类型指

C++_知识点_指针类型转换

#include <iostream> using namespace std; int main(){ short int arr[10] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; int* p = (int*)arr; for(; p <= ((int*)(&arr[10])); ++p){ cout << "*p = " << *p << endl; } return 0; } 0 1 2 3

php类型转换以及类型转换的判别

部分摘自PHP: 类型 - Manual 相关链接 PHP 在变量定义中不需要(或不支持)明确的类型定义:变量类型是根据使用该变量的上下文所决定的.也就是说,如果把一个 string 值赋给变量 $var,$var 就成了一个 string.如果又把一个integer 赋给 $var,那它就成了一个integer. PHP 的自动类型转换的一个例子是加法运算符“+”.如果任何一个操作数是float,则所有的操作数都被当成float,结果也是float.否则操作数会被解释为integer,结果也是

Go语言的基本类型转换-golang类型转换

简单整理一下Golang的基本类型转换,作为备忘: 1.整形到字符串: var i int = 1 var s string 3.  s = strconv.Itoa(i) 或者 s = FormatInt(int64(i), 10) 2.字符串到整形 var s string = "1" var i int i, err = strconv.Atoi(s) 或者 i, err = ParseInt(s, 10, 0) 3.字符串到float(32 / 64) var s string

指针强制类型转换的理解

前几天在判断  “值相同的两个指针所指向的变量的值可以不同 ”  这句话时,发现自己对指针类型一些概念仅仅是记住了结论.于是查阅了一些资料,记录一下一些与指针类型和指针类型转化相关的知识.    一些用到的 开始之前,先来复习一些会用到的知识. 1.地址,字节,位 位(bit)是电子计算机中最小的数据单位.每一位的状态只能是0或1. 字节(Byte)是用于计量存储容量的一种单位,每一个字节由8位组成(1Byte = 8bit). 地址可以理解为在一片内存中,每个字节(Byte)的编号. 他们在内

c++的四种强制类型转换

http://hb.qq.com/a/20110722/001452.htm ...... C风格的强制类型转换(Type Cast)很简单,不管什么类型的转换统统是:TYPE b = (TYPE)a C++风格的类型转换提供了4种类型转换操作符来应对不同场合的应用. const_cast,字面上理解就是去const属性或volatile属性. static_cast,命名上理解是静态类型转换.如int转换成char. 类似于C风格的强制转换.无条件转换,静态类型转换.用于: 1. 基类和子类之

C语言中将0到1000的浮点数用强制类型转换的方式生成一幅图像

搞过计算机图像的人都知道,图像中的每一个像素通常为一个整型数,它可以分成4个无符号的char类型,以表示其RGBA四个分量.一幅图像可以看做是一个二维整型数组.这里我会生成一个float数组,其数组大小为1000000,刚好1000*1000,数组内的浮点数的数值范围在0到1000.0之间,呈等差数组排列,相邻两数的差为0.001.然后将其每一个浮点数强制转化成一个整型数或三个unsigned char型,以决定像素的RGB三个通道分量,看看其生成的图像是什么样子. 前几天写了一篇文章是在C语言