C语言中unsigned char* 与char*的区别?

转载 2015年07月10日 08:57:59

http://bbs.csdn.net/topics/390184854

C/C++ code
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <stdio.h>
 
int main()
{
 
        unsigned char k = 0;
        int i = -1;
        short a = -12345;
        char *p;
        printf("sizeof(i) = %d\n",sizeof(i));
 
        printf("sizeof(a) = %d\n",sizeof(a));
 
        p = (char*)&a;
        for(k=0;k<sizeof(a);k++)
        {
                printf("%x ",*(p++));
 
        }
        printf("\n");
        p = (char*)&i;
        for(k=0;k<sizeof(i);k++)
        {
                printf("%x ",*(p++));
 
        }
        printf("\n");
        printf("i = %u | %d\n",i,i);
        printf("a = %u | %d\n",a,a);
 
 
        printf("res = %d\n",(-1>0u ? 1:0));
        printf("hello world\n");
 
        return 0;
}

上述代码经编译执行后的结果为:
sizeof(i) = 4
sizeof(a) = 2
ffffffc7 ffffffcf 
ffffffff ffffffff ffffffff ffffffff 

i = 4294967295 | -1
a = 4294954951 | -12345
res = 1
hello world

请问为什么char类型的指针p输出的都是32位的内容呢?
将指针p的声明更改为unsigned char* p;程序输出结果如下:
sizeof(i) = 4
sizeof(a) = 2
c7 cf 
ff ff ff ff 

i = 4294967295 | -1
a = 4294954951 | -12345
res = 1
hello world

请问unsigned char* 与char*在这个程序中为什么能产生这种不同的结果?


char*是有符号的, 如果大于127即0x7F的数就是负数了,使用%x格式化输出,就会产生变化.

所以使用%x格式化输出数据时,记得一定要转换成无符号类型.


  printf("%02x ",(unsigned char)*(p++));


有符号的字符型数据C7,CF分别传入printf,此时会将类型提升为int,由于是有符号数,所以符号位要进行扩展,得到FFFFFFCF和FFFFFFC7。

无符号的字符型数据C7,CF分别传入printf,此时会将类型提升为unsigned int,由于无符号数不进行符号位扩展,所以得到000000CF和00000C7。


p指针指向的内容确定是一个字节,无论把它解读成有符号或是无符号数,都是一个字节长度,但为什么printf会针对无符号和有符号进行符号位扩展呢,即类型提升?
难道printf默认打印16进制格式内容时,会依据平台相关的机器字长来打印吗


因为你用了%x所以提升


你用printf时不是指定了输出的格式了吗,就按你指定的格式进行转换,具体字长由编译器决定


printf("%02x ",(unsigned char)*(p++));

正解!(^_^)

c语言中 char* 和 unsigned char* 的区别浅析

背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用时作为函数的unsigned char*类型的参数调用。这个警告很容易避免,但是char*和unsigned char*到底...
  • guotianqing
  • guotianqing
  • 2017年08月17日 21:43
  • 429

该使用char还是unsigned char

这个问题似乎很简单,要表示8位无符号数值的时候,用unsigned char,要表示8位有符号数值或者ASCII字符的时候,用char。但是,有的时候会遇到这样一种情况,从一串字符串中取出的字符,既有...
  • lfw19891101
  • lfw19891101
  • 2011年07月25日 11:29
  • 6907

char 与 unsigned char的本质区别

转自:http://www.cnblogs.com/qytan36/archive/2010/09/27/1836569.html 在C中,默认的基础数据类型均为signed,现在我...
  • yasi_xi
  • yasi_xi
  • 2015年04月03日 20:37
  • 1349

char与signed char, unsigned char的区别?

一、问题的提出 今天有一个困扰的问题,就是char与signed char, unsigned char这三者的区别。 二、三者之间关系 1.ANSI C 提供了3种字符类型,分别是char、sign...
  • sinat_20265495
  • sinat_20265495
  • 2016年06月22日 11:35
  • 17488

关于unsigned char和signed char的问题

unsigned char与char的区别2007-10-18 11:24 Character value...
  • zhongrg
  • zhongrg
  • 2007年11月11日 20:09
  • 8676

在C语言中,unsigned char是什么类型?

unsigned char是无符号字节型,char类型变量的大小通常为1个字节(1字节=8个位),且属于整型。整型的每一种都有无符号(unsigned)和有符号(signed)两种类型(float和d...
  • learngis
  • learngis
  • 2009年06月05日 08:49
  • 12624

unsigned char 的一个面试题

今天面试看到这么一个题。错误很隐蔽。。。分享出来大家看看; #include  #define MAX 255  int main() { unsigned char a[MAX],i;  ...
  • baoendemao
  • baoendemao
  • 2014年11月16日 20:02
  • 1281

关于unsigned char、unsigned short使用printf(“%d”)进行输出的结果

参考博客:C语言 unsigned 和 signed 类型相互转换深入理解 参考博客:unsigned和signed 对于unsigned 无符号数据类型是不应该向其赋值负数的,但是如果赋值了那会怎...
  • rockpk008
  • rockpk008
  • 2015年07月16日 00:11
  • 9843

C语言中关于char类型存储的分析 以及signed与unsigned的区别

char类型存储的分析 char和signed char 大家对char类型相信一定不会陌生的ANSI C 提供了3种字符类型,分别是char、signed char、...
  • Dawn_sf
  • Dawn_sf
  • 2017年01月16日 15:50
  • 1202

C语言char强制类型转换unsigned int时的问题

今天做socket通信项目的时候要从数据包的包头计算图片长和宽,结果图片大小不对显示了一张大长脸,做个记录给自己提个醒。 图片高度,高度都用四个字节表示,数据包从第五位开始每四位依次是宽,高,想也没...
  • qq_15106323
  • qq_15106323
  • 2017年06月07日 11:51
  • 377
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中unsigned char* 与char*的区别?
举报原因:
原因补充:

(最多只允许输入30个字)