问个类型转换问题

xjMatrix 2016-07-01 08:51:51
大家好,有如下代码:

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);

谢谢大家关注
...全文
141 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2016-07-02
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
paschen 版主 2016-07-02
  • 打赏
  • 举报
回复
不会报错,会用转换后的类型去解析内存中的数据
fefe82 2016-07-02
  • 打赏
  • 举报
回复
按照另一种类型重新解释内存中的内容,结果与 char / unsigned char 的实际编码方式有关。
小灸舞 2016-07-02
  • 打赏
  • 举报
回复
强转只是改变了解析内存的方式,内存中的数据并没有变
xjMatrix 2016-07-02
  • 打赏
  • 举报
回复
谢谢各位道友的解答,非常感谢
xjMatrix 2016-07-02
  • 打赏
  • 举报
回复
引用 8 楼 xiaohuh421 的回复:
你对数据在内存中的表示理解不足. 对于计算机, 只保存二进制数据, 没有其它数据类型. 一般我们都以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" 综上, 不管你把指针强制转换什么类型数据, 其内存表示都不会变, 只是当计算机要把数据翻译给人看的时候, 才会根据数据类型取对应字节数的数据, 再转换输出到屏幕上.
大赞,对于我这种初级人员,你的这个回复太有用了
xiaohuh421 2016-07-02
  • 打赏
  • 举报
回复
你对数据在内存中的表示理解不足. 对于计算机, 只保存二进制数据, 没有其它数据类型. 一般我们都以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" 综上, 不管你把指针强制转换什么类型数据, 其内存表示都不会变, 只是当计算机要把数据翻译给人看的时候, 才会根据数据类型取对应字节数的数据, 再转换输出到屏幕上.
xjMatrix 2016-07-01
  • 打赏
  • 举报
回复
引用 1 楼 iyomumx 的回复:
1.二进制表示不变,指针指向的内容不会发生任何变化,但由于指针类型的不同,直接解引用得到的值会发生变化 2.编译错误
谢谢你的回答,“直接解引用得到的值会发生变化”,这句话是不是说如果本来数组项表示的值是-1(1000 0001),转换为unsigned char*传进函数后这一项就被当做129处理了是不?
原来身后 2016-07-01
  • 打赏
  • 举报
回复
完全可以这样用,比如当做参数传递,当做返回值返回。但是解引用时候记得把指针类型再转换回来,指针不会影响内存数据,但是解引用需要正确的数据类型。
iyomumx 2016-07-01
  • 打赏
  • 举报
回复
1.二进制表示不变,指针指向的内容不会发生任何变化,但由于指针类型的不同,直接解引用得到的值会发生变化 2.编译错误

64,439

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧