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[]数组的相互转换

#include #include using namespace std; void convertUnCharToStr(char* str, unsigned char* UnChar, ...

该使用char还是unsigned char

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

C语言中 unsigned char 与 signed char 不同输出格式一些认识

首先考虑一段代码:
  • ssopp24
  • ssopp24
  • 2016年10月17日 13:53
  • 3226

char与signed char, unsigned char的区别?

一、问题的提出 今天有一个困扰的问题,就是char与signed char, unsigned char这三者的区别。 二、三者之间关系 1.ANSI C 提供了3种字符类型,分别是char、sign...

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

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

定义unsigned char型指针读取变量在内存中每个字节的内容

一、 //By Richard #include int main() { int i=65535; unsigned char *c; c=(unsigned char...

unsigned char类型指针与int型数据的转换

unsigned char类型指针与int型数据的转换 2010-12-31 17:58:46 标签:style 嵌入式 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处...

unsigned short *Sum( unsigned char a,unsigned char b);关于指针的一些思考

c语言中的指针实在是令人头疼的事,看了很多有关指针的文章,最近看到这样一道题目,有点恍然大悟就写下了这篇文章,希望对大家有所帮助,也希望指出不足的地方。 首先要说明的是,这道题的答案其实比不是我要讲...

有关c语言数据类型转换之char,unsigned char,unsigned short

这是一道朗讯的笔试题(我把一些相关资料汇总了一下,希望大家能进来广泛的探讨,不甚感激!) #include int main() {     char  ca;     unsigned ...

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
  • 1216
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C语言中unsigned char* 与char*的区别?
举报原因:
原因补充:

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