C语言 请问signed char,unsigned char,short,unsigned sh

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言 请问signed char,unsigned char,short,unsigned sh相关的知识,希望对你有一定的参考价值。

C语言 请问signed char,unsigned char,short,unsigned short,unsigned int,long,unsigned long,long long,unsigned long long这些数据类型的格式说明符对应是什么?我想知道计算机里各个数据类型的范围,以后好针对性地使用

signed 和 unsigned 是C语言中的类型指示符(type specifier),signed 指示被声明的对象的类型为有符号整型(signed integer type),unsigned 指示被声明的对象的类型为无符号整型(unsigned integer type)。
除了用于 bit field,单独使用的 int 即指示有符号整型,此时 signed 没有实际意义,int 和 unsigned 一同使用时指示无符号整型。
char,signed char,unsigned char 是三个不同的类型(char 和另外两个之一的二进制表示方法相同,至于 char 具体是否有符号,通常可通过编译指令指定)。
对于 bit field, signed int 类型的 bit field 总是有符号的,unsigned int 类型的 bit field 总是无符号的,而单独使用的 int 是否表示有符号,由编译器定义。

无符号数的二进制表示(object representation)由两部分构成,即 value bits 和 padding bits,value bits 是一串二进制位,第 M 个 value bit 表示 2 的 M-1 次方,因此 N 个 value bits 加起来就可以表示 0 到 2 的 N 次方减一 这个范围内的所有整数。padding bits 不影响数的值(可能不存在 padding bit )。
有符号数的二进制表示(object representation)由三部分构成,即 sign bit,value bits 和 padding bits ,其中 sign bit 只有一位,这一位的值为 0 时表示这个数为正数,此时它不影响有符号数的值,value bits 的含义与无符号数中的 value bits 相同。sign bit 为 1 时表示这个数为负数,此时这个数可以使用原码、反码、补码 中的任何一种编码来表示数值。和无符号数一样,padding bits 不影响数的值(可能不存在 padding bit )。
例如,当某个无符号类型有 32 个value bits 时,它的第 1 个 value bit 表示 2 的 0 次方,第 2 个 value bit 表示 2 的 1 次方,……,第 32 个 value bit 表示 2 的 31 次方。当所有 value bits 都为 1 时,就表示 2 的 0 次方加 2 的 1 次方加……加 2 的 31 次方,即 2 的 32次方减一;当所有的 value bits 都为 0 时,就表示 0 ,这个无符号类型的取值范围就是 0 到 2 的 32 次方减一。
与之对应的有符号类型有 1 个sign bit 和 31 个 value bits,当 sign bit 为 0 时,可以表示 0 到 2 的 31 次方减一范围内的任何一个整数,如果使用补码,当 sign bit 为 1 时,可以看作 sign bit 的值是 2 的 31 次方 的相反数,因此当 sign bit 为 1 时 sign bit 加上 value bit 一共可以表示 2 的 31 次方 的相反数到 -1 范围内的任何一个整数,考虑所有情况,这个有符号类型的取值范围就是 2 的 31 次方 的相反数 到 2 的 32 次方减一。
参考技术A .h是C语言和C++语言的头文件。 1、一般在.h类的头文件里面只放入函数声明,宏定义,函数原型,而具体的实现在.cpp文件里面; 2、举例说明:比如在里面看到的数学函数都只有声明,具体实现在里面; 3、在编译的时候,编译器会自动加载和.h匹配的。

用unsigned char 表示字节

在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed) char与unsigned char之间的区别 

首先在内存中,char与unsigned char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-128~127, unsigned char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。

在实际使用过程种有什么区别呢?

主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。

但是我们却发现在表示byte时,都用unsigned char,这是为什么呢?

首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。

如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned int也会扩展)

而如果是unsigned char,那么不会扩展。

这就是二者的最大区别。

同理可以推导到其它的类型,比如short, unsigned short。等等

具体可以通过下面的小例子看看其区别

include <stdio.h>

 

void f(unsigned char v)

{

    char c = v;

    unsigned char uc = v;

    unsigned int a = c, b = uc;

    int i = c, j = uc;

    printf("----------------\n");

    printf("%%c: %c, %c\n", c, uc);

    printf("%%X: %X, %X\n", c, uc);

    printf("%%u: %u, %u\n", a, b);

    printf("%%d: %d, %d\n", i, j);

}

 

int main(int argc, char *argv[])

{

    f(0x80);

    f(0x7F); 

    return 0;

}

 

输出结果:

----------------

%c: ?, ?

%X: FFFFFF80, 80

%u: 4294967168, 128

%d: -128, 128

----------------

%c: , 

%X: 7F, 7F

%u: 127, 127

%d: 127, 127

由此可见,最高位若为0时,二者没有区别,若为0时,则有区别了。

以上是关于C语言 请问signed char,unsigned char,short,unsigned sh的主要内容,如果未能解决你的问题,请参考以下文章

在C语言中,unsigned char是啥类型

c语言signed char, char, unsinedchar区别

unsigned char 和 signed char 区别

在C语言中,unsigned char是啥类型

C语言 unsigned short 如何相互转 signed char

unsigned和signed char