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语言signed char, char, unsinedchar区别
unsigned char 和 signed char 区别