请教unsigned char 指针和char指针和有啥区别?谢谢

oracleperl 2020-03-24 09:34:35
请教unsigned char 指针和char指针和有啥区别?谢谢
...全文
2757 41 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
唉嘿 2021-02-25
  • 打赏
  • 举报
回复
哥你这话说的太狠了
大脸猫要吃糖 2020-03-28
  • 打赏
  • 举报
回复
指针指向的数据类型不一样。指针就是数据存放的地址,unsigned char 指针指向的数据类型为unsigned char 型,char 指针指向的数据类型为char 型。
繁华散尽、 2020-03-27
  • 打赏
  • 举报
回复
无符号可以表示更大的正整数,有符号的可以表示负数和正整数,但是正整数的范围相应也会小一半
繁华散尽、 2020-03-27
  • 打赏
  • 举报
回复 1
无符号可以表示更大的正整数,有符号的可以表示负数和正整数,但是正整数的范围相应也会小一半
繁华散尽、 2020-03-27
  • 打赏
  • 举报
回复
无符号可以表示更大的正整数,有符号的可以表示负数和正整数,但是正整数的范围相应也会小一半
往事如烟0819 2020-03-26
  • 打赏
  • 举报
回复
指针,存储的是指向对象(常量,变量,函数,数组等)的类型。 指针的类型是指向对象的类型,并不是本身地址的类型。
luj_1768 2020-03-26
  • 打赏
  • 举报
回复
ascii字符集只使用7位编码,对第八位的处理没有约定,由各系统实现厂商自行定义。双字节编码则使用16位完全编码并且预留一些空号(系统保留)占位。byte* 和char* 的设计,可能与系统对编码系统的空号处理有关。
luj_1768 2020-03-26
  • 打赏
  • 举报
回复
在windowsAPI上,这是两个类型,一个是LPBYTE,另一个是不太常用的char*。
真相重于对错 2020-03-25
  • 打赏
  • 举报
回复
引用 28 楼 oracleperl 的回复:
[quote=引用 27 楼 真相重于对错 的回复:] 发现一个高位为一的字节,按汉字读取,因为汉字是两个字节,因此一次都两个,就不用管他下一个字节的高位到底是1还是0
问题出在,我是从字符串的右边开始往左边回溯的 比如 “好A”我是从A开始往左边判断,就不对了 如果从“好”开始往右边判断,那么没问题 如果从右边往左边移动判断,完全可能A和“好”的低位字节也是构成 一个汉字的 [/quote] 从右往左,你可以先读取完毕后在处理啊?
mdhj7773 2020-03-25
  • 打赏
  • 举报
回复
从今天开始,初五准备一天三更,求大家的收藏和推荐哈!12点,17点,20点,准时三更!
滚瓜溜圆 2020-03-25
  • 打赏
  • 举报
回复
本质上来讲,uc指针和char指针都是指向一个BYTE空间的指针,没有区别,数值上指针都是地址值,也没有区别。只是指向的这一个字节的空间里,存的是有符号数据,还是无符号数据。
千梦一生 2020-03-24
  • 打赏
  • 举报
回复
const char *s = "中";

unsigned char c;

memcpy(s,&c,sizeof(c));
真相重于对错 2020-03-24
  • 打赏
  • 举报
回复
char str[] = "哈哈1你好23";
    char* p = str;
    while (*p != '\0')
    {
        char hz[3] = { 0 };
        if (*p&0x80)
        {
            hz[0] = *p;
            printf("高位编码:%x|", (*p)&0x000000ff);
            p++;
            hz[1] = *p;
            printf("底位编码:%x ", (*p)&0x000000ff);
            printf("\t字符:%s\n", hz);
        }
        else
        {
            printf("编吗:%x \t 字符: %c\n", *p, *p);
        }
        p++;
    }
oracleperl 2020-03-24
  • 打赏
  • 举报
回复
引用 11 楼 千梦一生 的回复:
比如: 情景如下: { 内存某处32位数据 0000 0001, 0000 0000, 0000 0000, 1000 0000 其中1这里正是地址0x12345678 } char *p_c = 0x12345678; unsigned char *p_uc = 0x12345678; int *p_i =0x12345678; 此时两个指针是相等的。值相同,记录的地址都一样,都是0x12345678 --------------------------------- 现在取值: char a1 = *p_c;//首先看char是一个字节,所以只取0x12345678开始的1个字节。即取到0 000 0001。 unsigend char a2 = *p_c;//首先看unisgned char是一个字节,所以只取0x12345678开始的1个字节。即取到0 000 0001。 int a3 = *p_i;//首先看int是四个字节,所以只取0x12345678开始的4个字节。即取到0 000 0001,0000 0000,0000 0000,1000 0000 ---------------------------------- 最后,a1和a2在内存中的值是一模一样的。只不过a1是被作为char进行解读的,a2是被作为unsigned char被解读的。 a3的值 为-1。(不过这也得看什么大端小端存储的东西)
我想说的是
引用 11 楼 千梦一生 的回复:
比如: 情景如下: { 内存某处32位数据 0000 0001, 0000 0000, 0000 0000, 1000 0000 其中1这里正是地址0x12345678 } char *p_c = 0x12345678; unsigned char *p_uc = 0x12345678; int *p_i =0x12345678; 此时两个指针是相等的。值相同,记录的地址都一样,都是0x12345678 --------------------------------- 现在取值: char a1 = *p_c;//首先看char是一个字节,所以只取0x12345678开始的1个字节。即取到0 000 0001。 unsigend char a2 = *p_c;//首先看unisgned char是一个字节,所以只取0x12345678开始的1个字节。即取到0 000 0001。 int a3 = *p_i;//首先看int是四个字节,所以只取0x12345678开始的4个字节。即取到0 000 0001,0000 0000,0000 0000,1000 0000 ---------------------------------- 最后,a1和a2在内存中的值是一模一样的。只不过a1是被作为char进行解读的,a2是被作为unsigned char被解读的。 a3的值 为-1。(不过这也得看什么大端小端存储的东西)
干写大神 我想这样 内存中有一块存储区域,new出来的 然后memcpy 一个字节到一个char型或者unsigned char变量,假设是c 然后再判断c的十进制值 我发现我memcpy半个汉字到c时,实际值时负数,我需要正数,才能是否在GBK编码范围内。 谢谢
千梦一生 2020-03-24
  • 打赏
  • 举报
回复
比如:
情景如下:
{
内存某处32位数据
0000 0001, 0000 0000, 0000 0000, 1000 0000
其中1这里正是地址0x12345678
}
char *p_c = 0x12345678;
unsigned char *p_uc = 0x12345678;
int *p_i =0x12345678;
此时两个指针是相等的。值相同,记录的地址都一样,都是0x12345678
---------------------------------
现在取值:
char a1 = *p_c;//首先看char是一个字节,所以只取0x12345678开始的1个字节。即取到0 000 0001。
unsigend char a2 = *p_c;//首先看unisgned char是一个字节,所以只取0x12345678开始的1个字节。即取到0 000 0001。
int a3 = *p_i;//首先看int是四个字节,所以只取0x12345678开始的4个字节。即取到0 000 0001,0000 0000,0000 0000,1000 0000

----------------------------------
最后,a1和a2在内存中的值是一模一样的。只不过a1是被作为char进行解读的,a2是被作为unsigned char被解读的。
a3的值 为-1。(不过这也得看什么大端小端存储的东西)
oracleperl 2020-03-24
  • 打赏
  • 举报
回复
引用 9 楼 千梦一生 的回复:
引用 9 楼 千梦一生 的回复:
int *p_i = 0x12345678; char *p_c = 0x12345678; unsigned char *p_uc = 0x123456789; p_i和p_c指向的是同一个地址、位置。 当你尝试取值的时候发现问题有点区别了。 尝试取p_i所指向的值的时候 通过代码: var a = *p_i ;//此时会发现 *p_i取的是,从0x12345678开始4个字节的数据,来视作int var a = *p_c;//此时会发现 *p_i取的是,从0x12345678开始1个字节的数据,来视作char var a = *p_uc;//此时会发现 *p_ui取的是,从0x12345678开始1个字节的数据,来视作unsigned char
感谢,请问p_c 和p_uc保存的地址是一样的吗?我还是看不出来它们的区别? P_C保存的地址可以赋值给P_UC吗? 其实我是想将内存里的一个byte,memcpy到一个char型变量,然后判断十进制的值 我发现汉字的高位时负的,如何得到正的值?
千梦一生 2020-03-24
  • 打赏
  • 举报
回复
int *p_i = 0x12345678;
char *p_c = 0x12345678;
unsigned char *p_uc = 0x123456789;
p_i和p_c指向的是同一个地址、位置。

当你尝试取值的时候发现问题有点区别了。
尝试取p_i所指向的值的时候

通过代码:
var a = *p_i ;//此时会发现 *p_i取的是,从0x12345678开始4个字节的数据,来视作int
var a = *p_c;//此时会发现 *p_i取的是,从0x12345678开始1个字节的数据,来视作char
var a = *p_uc;//此时会发现 *p_ui取的是,从0x12345678开始1个字节的数据,来视作unsigned char

oracleperl 2020-03-24
  • 打赏
  • 举报
回复
这样是要报错的 unsigned char c='\0'; char *pt_c=&c; rror C2440: “初始化”: 无法从“unsigned char *”转换为“char *”
oracleperl 2020-03-24
  • 打赏
  • 举报
回复
引用 6 楼 真相重于对错 的回复:
[quote=引用 5 楼 oracleperl 的回复:] [quote=引用 3 楼 真相重于对错 的回复:] 有符号只是用了7位,最高位为符号位,表示数据位-128到127,负数用补吗表示。 无符号使用了8位,表示数据是0-255.
指针是一个地址,也有有符号和无符号之分?[/quote] 地址没有区别,区别只在于如何确定它指向的东西。。。。[/quote] 但我吧熊定义个char指针指向unsigned char字符,编译通不过
真相重于对错 2020-03-24
  • 打赏
  • 举报
回复
引用 5 楼 oracleperl 的回复:
[quote=引用 3 楼 真相重于对错 的回复:] 有符号只是用了7位,最高位为符号位,表示数据位-128到127,负数用补吗表示。 无符号使用了8位,表示数据是0-255.
指针是一个地址,也有有符号和无符号之分?[/quote] 地址没有区别,区别只在于如何确定它指向的东西。。。。
加载更多回复(21)

65,187

社区成员

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

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