大家好,有如下代码:
char ch[16] = { 0 }; // To do other work. function((unsigned char*)ch);
本人有个疑问,当char* 指向的是signed char数组时,假如代码把ch转换为unsigned char*传进函数里,那么ch数组中小于0的数组项会被怎么样处理?会报出错误吗?
另外,像下面这样直接强转时又会发生什么情况呢?
char *p = new char[100]; unsigned char *pU = static_cast<unsigned char *>(p);
谢谢大家关注
解决方案
10
1.二进制表示不变,指针指向的内容不会发生任何变化,但由于指针类型的不同,直接解引用得到的值会发生变化
2.编译错误
2.编译错误
20
完全可以这样用,例如当做参数传递,当做返回值返回。但是解引用时候记得把指针类型再转换回来,指针不会影响内存数据,但是解引用需要正确的数据类型。
10
强转只是改变了解析内存的方式,内存中的数据并没有变
5
按照另一种类型重新解释内存中的内容,结果与 char / unsigned char 的实际编码方式有关。
10
不会报错,会用转换后的类型去解析内存中的数据
15
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……
推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
30
你对数据在内存中的表示理解不足.
对于计算机, 只保存二进制数据, 没有其它数据类型. 一般我们都以16进制看内存数据.
例如有内存数据
BYTE buf[5]={0x40, 0x41, 0x42,0x43,0};
假如在调试模式下, 你把buf的地址值, 放到内存窗口查看, 就会看到内存16进制表示为 40 41 42 43 00
这时, 假如你强制把buf转换成int类型指针.
如
int *pInt = (int*)buf;
这时, 你发现pInt也指向buf的同一个地址, 但内存中的值还是40 41 42 43 00, 不会作任何改变.
只有当你想输出 printf(“%d”,*pInt); 原因是在32位程序中是4个字节, 所以输出时会取出前4个字节 40 41 42 43, 由于window是大小端表示, 这个int数据就是 0x43424140 , 10进制表示就是1128415552
同理, 假如你有如下转换
char *pStr = (char*)buf;
那么会计算机就会读取把 40 41 42 43作为ASCII码, 查出要显示的字符. 40是@ 41是A 42是B 43是C
所以 pStr就是 “@ABC”
综上, 不管你把指针强制转换什么类型数据, 其内存表示都不会变, 只是当计算机要把数据翻译给人看的时候, 才会根据数据类型取对应字节数的数据, 再转换输出到屏幕上.
对于计算机, 只保存二进制数据, 没有其它数据类型. 一般我们都以16进制看内存数据.
例如有内存数据
BYTE buf[5]={0x40, 0x41, 0x42,0x43,0};
假如在调试模式下, 你把buf的地址值, 放到内存窗口查看, 就会看到内存16进制表示为 40 41 42 43 00
这时, 假如你强制把buf转换成int类型指针.
如
int *pInt = (int*)buf;
这时, 你发现pInt也指向buf的同一个地址, 但内存中的值还是40 41 42 43 00, 不会作任何改变.
只有当你想输出 printf(“%d”,*pInt); 原因是在32位程序中是4个字节, 所以输出时会取出前4个字节 40 41 42 43, 由于window是大小端表示, 这个int数据就是 0x43424140 , 10进制表示就是1128415552
同理, 假如你有如下转换
char *pStr = (char*)buf;
那么会计算机就会读取把 40 41 42 43作为ASCII码, 查出要显示的字符. 40是@ 41是A 42是B 43是C
所以 pStr就是 “@ABC”
综上, 不管你把指针强制转换什么类型数据, 其内存表示都不会变, 只是当计算机要把数据翻译给人看的时候, 才会根据数据类型取对应字节数的数据, 再转换输出到屏幕上.