精华内容
下载资源
问答
  • char 又分为 signed char (有符号类型) 和 unsigned char (无符号类型)。 通常,我们的理解是62616964757a686964616fe58685e5aeb931333365663537将char 作为 signed char 来处理。2.我们先来看 signed char的最大值...

    展开全部

    1.char 是一个字节类型。 由8位组成。  char 又分为 signed char (有符号类型) 和 unsigned char (无符号类型)。 通常,我们的理解是62616964757a686964616fe58685e5aeb931333365663537将char 作为 signed char 来处理。

    2.我们先来看 signed char的最大值。  最高位是 符号位, 0 代表正数; 1 代表负数。0 1 1 1  1 1 1 1     这个值等于 2^0 + 2^1 + 2^2  + 2^3  + 2^4  + 2^5  + 2^6  = 127  。 也有一个简便计算方法:2^7 -1 = 128-1 =127   所以,signed char 的最大值是 127 。  这个容易理解。

    3.接下来,看看 singed char 的 最小值 是如何计算的?需要明白一个概念, 在计算机中, 数值是以补码形式存储的。 正数的补码是其本身; 而负数的补码是 取反 (符号位保持不变),再加1。

    4.我们先来看 -1 的存储过程:

    -1:     1 0 0 0  0  0  0  1    ->(取反) 1 1 1 1 1 1 1 0     ->(加1)  1 1 1 1 1 1 1 1

    -2:  1 0 0 0  0  0  1  0    ->(取反) 1 1 1 1 1 1 0 1     ->(加1)  1 1 1 1 1 1 1 0

    -3:  1 0 0 0  0  0  1  1    ->(取反) 1 1 1 1 1 1 0 0     ->(加1)  1 1 1 1 1 1 0 1

    … …

    -127   1 1 1 1  1  1  1  1    ->(取反) 1 0 0 0 0 0 0 0     ->(加1)  1 0 0 0 0 0 0 1

    -128   1 0 0 0  0  0  0  0    ->(取反) 1 1 1 1 1 1 1 1     ->(加1)   1 0 0 0  0  0  0  0

    5.不管是原码还是补码, 总会出现  -0 这个值。 本来 +0 与 -0 是没有区别的。 但对于存储器和编译器来讲,总得充分利用每个字节吧, 更不想出现二义性。 那么,干脆将 -0 表示为 -128 , 这样一来,既增大了signed char 数值的表示范围,又消除了 -0 的二义性,所以signed char的取值范围是 -128~127。

    9b9ea9492170d683fc7e1d2f84eda145.png

    拓展资料

    char是C/C++整型数据中比较古怪的一个,其它的如int/long/short等不指定signed/unsigned时都默认是signed,但char在标准中是unsigned,编译器可以实现为带符号的,也可以实现为不带符号的,有些编译器如pSOS的编译器,还可以通过编译开关来指定它是有符号数还是无符号数。

    char是characteristic的简写,表示一个环或者域的特征,即最小的非负整数n,使ne=0。(e为单位元) 。

    展开全文
  • charunsigned char 的区别 ...不同点:char的最高位为符号位,因此char表示的数据范围是-128~127,unsigned char没有符号位,因此能表示的数据范围是0~255 实际使用中,如普通的赋值,读写文

    char 和 unsigned char 的区别
    在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的。如果要定义无符号类型,必须显式地在变量类型前加unsigned。

    char vs unsigned char
    相同点:在内存中都是一个字节,8位(2^8=256),都能表示256个数字
    不同点:char的最高位为符号位,因此char能表示的数据范围是-128~127,unsigned char没有符号位,因此能表示的数据范围是0~255

    实际使用中,如普通的赋值,读写文件和网络字节流都没有区别,不管最高位是什么,最终的读取结果都一样,在屏幕上面的显示可能不一样。

    但是要把一个char类型的变量赋值给int、long等数据类型或进行类似的强制类型转换时时,系统会进行类型扩展,这时区别就大了。对于char类型的变量,系统会认为最高位为符号位,然后对最高位进行扩展,即符号扩展。若最高位为1,则扩展到int时高位都以1填充。对于unsigned char类型的变量,系统会直接进行无符号扩展,即0扩展。扩展的高位都以0填充。所以在进行类似的操作时,如果char和unsigned char最高位都是0,则结果是一样的,若char最高位为1,则结果会大相径庭。

    可以使用的下面的小程序验证一下:

    #include <stdio.h>
    static void func(unsigned char uc)
    {
    char c;
    int i, j;
    unsigned int ui, uj;

    c = uc;
    i = (int)c;
    j = (int)uc;
    ui = (unsigned int)c;
    uj =(unsigned int)uc;
    printf("%%c: %c, %c\n", c, uc);
    printf("%%x: %x, %x\n", c, uc);
    printf("%%u: %u, %u\n", ui, uj);
    printf("%%d: %d, %d\n", i, j);
    

    }

    int main(int argc, char *argv[])
    {
    func(0x80);
    func(0x7f);

    return 0;
    

    }
    运行结果如下:
    %c: �, �
    %x: ffffff80, 80
    %u: 4294967168, 128
    %d: -128, 128

    %c:,
    %x: 7f, 7f
    %u: 127, 127
    %d: 127, 127
    对于char来说,0x80用二进制表示为1000 0000,当它作为char赋值给unsigned int或 int 时,系统认为最高位是符号位,会对最高位进行扩展。而0x7F用二进制表示为0111 1111,最高位为0,不会扩展。对于unsigned char来说,不管最高位是0,还是1,都不会做扩展。

    char* 和 unsigned char的区别
    char
    和 unsigned char* 也具有类似的区别,如下面测试程序所示:

    #include <stdio.h>
    int main(int argc, char *argv[])
    {
        unsigned char k = 0;
        int i = -1;
        short a = -12345;
        char *p;
        unsigned char *q;
    
        printf("sizeof(i) = %d\n",sizeof(i));
        printf("sizeof(a) = %d\n",sizeof(a));
        printf("-----------------------------\n");
        printf("begin p(char):\n");
        p = (char*)&a;
        printf("a = %u | %d\n",a,a);
        for(k=0;k<sizeof(a);k++)
        {
            printf("0x%x ",*(p++));
        }
        printf("\n");
        p = (char*)&i;
        printf("i = %u | %d\n",i,i);
        for(k=0;k<sizeof(i);k++)
        {
            printf("0x%x ",*(p++));
        }
        printf("\n");
        printf("-1 > 0u: %s\n",(-1>0u ? "true":"false"));
        printf("-----------------------------\n");
        printf("begin q(unsigned char):\n");
        q = (unsigned char*)&a;
        printf("a = %u | %d\n",a,a);
        for(k=0;k<sizeof(a);k++)
        {
            printf("0x%x ",*(q++));
        }
        printf("\n");
        q = (unsigned char*)&i;
        printf("i = %u | %d\n",i,i);
        for(k=0;k<sizeof(i);k++)
        {
            printf("0x%x ",*(q++));
        }
        printf("\n");
        printf("-1 > 0u: %s\n",(-1>0u ? "true":"false"));
    
        return 0;
    }
    

    输出结果为:
    sizeof(i) = 4
    sizeof(a) = 2
    begin p(char):
    a = 4294954951 | -12345
    0xffffffc7 0xffffffcf
    i = 4294967295 | -1
    0xffffffff 0xffffffff 0xffffffff 0xffffffff
    -1 > 0u: true

    begin q(unsigned char):
    a = 4294954951 | -12345
    0xc7 0xcf
    i = 4294967295 | -1
    0xff 0xff 0xff 0xff
    -1 > 0u: true

    char*是有符号的,如果大于127即0x7F的数就是负数了,使用%x格式化输出,系统自动进行了符号扩展,就会产生变化。

    所以在涉及到类型提升的上下文中,要注意使用char和unsinged char的区别。

    展开全文
  • 不同点:char的最高位为符号位,因此char表示的数据范围是-128~127,unsigned char没有符号位,因此能表示的数据范围是0~255 实际使用中,如普通的赋值,读写文件和网络字节流都没有区别,不管最高位是什么,最终...

    相同点:在内存中都是一个字节,8位(2^8=256),都能表示256个数字
    不同点:char的最高位为符号位,因此char能表示的数据范围是-128~127,unsigned char没有符号位,因此能表示的数据范围是0~255

    实际使用中,如普通的赋值,读写文件和网络字节流都没有区别,不管最高位是什么,最终的读取结果都一样,在屏幕上面的显示可能不一样。

     

    QString转char *

    char *    tempbuff =qstrdup(recv.toAscii().constData());

     

    展开全文
  • 一个32位的signed int类型整数表示范围:-2^31~2^31-1 一个32位的unsigned int类型整数表示范围: 0~2^32-1 ...一个8位的unsigned char类型整数表示范围: 0~2^8-1 示例: int main() { char a[1000]; ...

    一个32位的signed int类型整数表示的范围:-2^31~2^31-1

    一个32位的unsigned int类型整数表示的范围: 0~2^32-1

     

    一个8位的signed char类型整数表示的范围:-2^7~2^7-1

    一个8位的unsigned char类型整数表示的范围: 0~2^8-1

     

    示例:

    int main()
    {
        char a[1000];
        int i = 0;
        for(i=0; i<1000; i++)
        {
             a[i] = -1 - i;
        }
        printf("%d\n", strlen(a));
        return 0;
    }

    答案:255

    分析:

    当i的值为0时,a[0]的值为-1,关键就是-1在内存是如何存储的。

    我们知道,在计算机内部数值一律使用补码存储。正数的补码与原码一致,负数的补码是符号位为1,其余位是该负数的绝对值按位取反后加1得到。

    按照负数的补码规则,可以知道-1的补码是0xff,-2的补码是0xfe。。。当i的值为127的时候,a[127]的值为-128,是char能表示的最小的数值。当i=129时,a[128]=-129,这时候发生溢出,-129需要9位才能保存下来,但是char的类型数据只有8位,所以最高位被丢弃,剩下的8位是原来9位补码的低8位,为1000 0000,当i增加到255时候,a[255]=-256,-256的补码的低8位是0000 0000,然后i=256时,a[256]=-257的补码低8位为1111 1111,由此开始新一轮的循环。。。。

    按照上面的分析,a[0]---a[254]的值都不为0,而a[255]的值为0,strlen函数是计算字符串长度的,并不包含字符串最后的'\0'。所以strlen(a)=255.

     

     

    那么,+0和-0在内存是如何存储的呢?

    十进制          原码            反码          补码

     +0         0000 0000    0000 0000   0000 0000

     -0        10000 0000    1111 1111   0000 0000

    展开全文
  • charunsigned char

    2013-09-25 11:03:37
    charunsigned char 本质上都是8字节,一个byte,都表示字符类型,不同的是进行算术和位操作时对应的数值范围不同: char -128-127 unsigned char 0-255 char 把最高位当符号位
  • C学习笔记-1-unsigned char表示范围

    千次阅读 2011-04-01 20:15:00
      #include "stdafx.h"     int _tmain(int argc, _TCHAR* argv[]) { unsigned char a=1; unsigned char t=a; t=1-3; unsigned char m=1; unsigned ...
  • 1. 区别与联系: 1)在定义字符类型时一般使用char来定义 2)char被当成有符号或是...3)在定义数值类型时使用 signed char 和 unsigned char,signed char表示-128—127,unsigned char表示0—255 4)三者在内存...
  • 关于int,signed int和 unsigned int的定义无可厚非,那关于char,signed charunsigned ...对于这类型的编译器来说,char表示范围通常是 -128 到 127 (ASCII 的范围是 0 到 127)。而另外一些编译器中,char
  • 关于带符号与无符号类型:整型int、short和long默认为带符号型,要获得无符号型必须规定该类型为unsigned。 一字节表示八位,即1byte=8bit; int 4byte=32bit,有符号范围为-2^31-1~2^31-1,无符号范围为0~2^32-1; ...
  • unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。 二、给其它类型变量赋值,符号扩展: unsigned char赋值给int、long等类型变量时,不会进行符号...
  • 今天在APUE上遇到unsigned char 来定义变量, 大家都是unsigned表示的是无符号,对于char类型来说 char 本身相当于...so,很显然一个字节的char类型表示数值范围是-128~127(补码),unsigned char 表示的数值范围是0
  • signed char & unsigned char

    2010-02-06 11:24:00
    signed char实际上是最小的整型,它应该用于内存非常宝贵,并且只需要-127到127范围内的整数值的情况下。这个范围只使用256个可用的8位值中的255个,第256个值的含义依赖于实现。最常见的情况下,它表示-128,但也...
  • unsigned charchar

    2012-07-26 11:46:42
    unsigned char表示数字范围是0-255,signed char表示数字范围是-128-127。对于表示负数的下限为什么是-128,而不是直观的-127,原因是涉及到了补码。 例如,-128其实在计算机内部的存储为10000000,对10000000进行...
  • charunsigned char字符类型

    千次阅读 2007-03-28 09:07:00
    http://lifepeak.net/it-jishu/char-range.html本文对char字符类型的范围unsigned char字符类型范围进行简单的分析,希望对大家的工作和学习有所帮助 首先给出一个题目:请打印出从65~127(10进制表示)的ASCII字符...
  • 以8bit为例,有符号的数占用了一个符号位,只有7位数值,正数范围在2^7-1,负数范围在2^8,因为负数根据补码表示的,补码就是-1=127-128,补码是127,-0=128-128,补码是128,一共可以表示的补码是0-128,所以负数的...
  • java语言基本数据类型在JAVA中一共有八种基本数据类型,他们分别是byte、short、int、long、float、double、char、boolean整型其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样byte的取值范围...
  • 在C++中字符型被分为了三种:char、signed charunsigned char。需要的注意:字符的表现形式只有两...关于带符号类型:带符号类型在表示范围内正值和负值的量应该平衡,例如,8比特理论上应该可以表示-127至127,大...
  • 以前在做图像处理的时候,一直不太...尽管它们都是8位,但是表示的数的范围却不相同:char: -128~127, unsigned char: 0~255。很明显,unsigned char才是正确的选择。 你可以这样定义: 1 struct { 2 char r; 3 ...
  • 1,如果char表示的范围在-128–+127之间,那么,转换成整数的时候数值大小不变,例如: char ch=i //i为-128到+127之间的整数 int inv=ch; //inv的值也为-128到+127之间的整数 2,如果char的表示范围不在-128到+127...
  • char转换为int/unsigned int的分析: 说明:试环境为vc++ 6.0 在vc++6.0中char是被看成...1,如果char表示范围在-128--+127之间,那么,转换成整数的时候数值大小不变,例如: char ch=i //i为-128到+127之...
  • 这东西实际编程时一直无视的,范围小了就换个大点的表示形式,但是总觉得基础知识还是掌握得好,免得到时候用移位运算或类型转换或笔试题时要花时间想。 C语言的基本类型有char、int、float、double,另外还有说明...

空空如也

空空如也

1 2 3 4 5 ... 19
收藏数 370
精华内容 148
关键字:

char表示范围unsigned