char unsigned char %d %u

前几天遇到了这么个问题 ,在学习 unsigned char和char 和signed char的区别时 ,说char的类型到底是signed 还是unsigned 取决于编译器 。

当时写了一串代码 如下:

char a=-1;
    printf("%d\n",sizeof(a));
    printf("%d\n",a);
    printf("%u\n",a);

先说%d 是将数据以int型的 十进制 格式输出;

%u 是将数据以unsigned int 的十进制格式输出;

那么为何会输出 4294967295呢? 再怎么理解 char 类型也只是占用了 一个字节  ,而这个结果分明是4个字节的最大整数啊!

为此当时还特意查看了 内存状况  如下:

查询了一下 cc在内存中表示的是 随机数 。

这就让我更难理解了:为何会输出一个 四个字节的最大int整数?

当时我百度的是 %d和%u的区别 ,,后来我知道 我的方向错了,,导致这个结果的原因是

printf 函数对于 unsigned 和signed char的区别。

1、printf中采用%d的格式输出  就是讲元素的内存块 以有符号的形式读出来,如char a=-1;

内存中就是 0xff ,这个数字用有符号的读出来 显示的就是 -1(原码,反码,补码的关系有讲)

而printf用%u的格式时 ,若被读的数是unsigned 类型,则不会有 “字符扩张”,若是signed 类型的(char short int long)都会有字符的扩展,而这个扩展在内存中是查看不到的,扩展成四个字节的数据, 具体如下:

若要读的数据 小于0,在内存中 符号位是1,扩展的时候,不足32位的都要在前面扩展出来的位补1(因为最前面是1,类似于<< >>左移右移时的方法),这个扩展出来的数 再以无符号int型十进制读。例如本例的-1 ,内存中是0xff ,扩展之后的就是0xff ff ff ff  这样再读就是4294967295了。

而如果是 1的话 内存中是0x01 (最前面是0) 所以扩展出来的也是0,即0x00 00 00 01,再读出来也是1.

#include<stdio.h>
int main()
{
    
    char c1=1,c2=-1;
    printf("%d\n",c1);
    printf("%d\n",c2);
    printf("%u\n",c1);
    printf("%u\n",c2);
    printf("#####################\n");
    long l1=1,l2=-1;
    printf("%d\n",l1);
    printf("%d\n",l2);
    printf("%u\n",l1);
    printf("%u\n",l2);
    printf("#####################\n");
    unsigned char c3=1,c4=-1;
    printf("%d\n",c3);
    printf("%d\n",c4);
    printf("%u\n",c3);
    printf("%u\n",c4);
    printf("#####################\n");
    unsigned long l3=1,l4=-1;
    printf("%d\n",sizeof(l4));
    printf("%d\n",l3);
    printf("%d\n",l4);
    printf("%u\n",l3);
    printf("%u\n",l4);
    return 0;
}

运行结果:

注:最后的unsigned long l4=-1;在以%u输出的时候,结果也是4294967295,但是却并不是字符扩展的结果,因为它本来就占了4个字节,在内存中为0xFF FF FF FF,所以输出像是也进行了字符扩展一样。

时间: 2024-10-25 06:03:19

char unsigned char %d %u的相关文章

[C知识点]char unsigned char signed char知识点

1.char,unsigned char, signed char 都是占一个字节. 2.signed char范围为 -128-127  0000 0000表示+0 1000 0000表示-0.+0和-0表示的值是一样的.为了不浪费这一位用1000 0000表示128 unsigned char范围为 0-256. 3. char根据编译器的不同,被解释成signed char或者unsigned char. 4.VC编译器.x86上的GCC都把char定义为signed char,而arm-

char/unsigned char/int/short 存储范围

Type Storage size Value range char 1 byte -128 to 127 or 0 to 255 unsigned char 1 byte 0 to 255 signed char 1 byte -128 to 127 int 2 or 4 bytes -32,768 to 32,767 or -2,147,483,648 to 2,147,483,647 unsigned int 2 or 4 bytes 0 to 65,535 or 0 to 4,294,9

char 与 unsigned char的本质区别

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别. 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

图像处理中像素点的问题:unsigned char 和 char

以前在做图像处理的时候,一直不太在意这个问题,对图像每个像素点的灰度值,总是认为char也可,unsigned char也可.尽管它们都是8位,但是表示的数的范围却不相同:char: -128~127, unsigned char: 0~255.很明显,unsigned char才是正确的选择. 你可以这样定义: 1 struct { 2     char r; 3     char g; 4     char b; 5 }pixel_t; 6 也可以这样定义: 8 struct { 9    

char 与 unsigned char之间的坑

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢? 主要是符号位,但是在普通的赋值,读写

#define XBYTE ((unsigned char volatile xdata *) 0)

今天在看别人的CAN总线程序的时候,突然发现了这么一句宏定义:#define XBYTE ((unsigned char volatile xdata *) 0),以前都没注意到过.后来查了一下,发现是在ABSACC.h这个头文件中的.这是C51中专有的东西,在C51编程中只要有外部扩展RAM,就得这样用.在51单片机中,RAM空间有内外之分,而内部RAM与外部256字节的RAM同地址,在有扩展外部RAM的系统中,有的会用上外部RAM的前256字节,有的前256字节没有用.以上的定义就是用上了前

char、signed char、unsigned char的区别

ANSI C 提供了3种字符类型,分别是char.signed char.unsigned char char相当于signed char或者unsigned char,但是这取决于编译器! 这三种字符类型都是按照1个字节存储的,可以保存256个不同的值. 不同的是取值范围signed char取值范围是 -128 到 127unsigned char 取值范围是 0 到 255 signed char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,

char与unsigned char 区别

char 与 unsigned char的本质区别 http://bbs.csdn.net/topics/270080484 同一个内存内容:10010000 你用char*   解释是-112 你用unsigned   char*   解释是144 还是同样这个内存内容赋给整型值,用unsigned   char   类型还是会得到144,用char类型的就会是负数. 真正的差别还是取决于你的程序.某些情况这两种类型表示都行. 补充一下: char 可能是signed char,也可能是uns

用unsigned char 表示字节

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字. 在实际使用过程种有什么区别呢? 主要是符号位,但是在普通的赋值,读写