关于 char 和 unsigned char 的区别

首先卖个关子:

为什么网络编程中的字符定义一般都为无符号的字符?

char buf[16] = {0};

unsigned char ubuf[16] = { 0 };

上面两个定义的区别是:

buf 是有符号类型的字符

ubuf 是五符号的字符

示例:

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

{

unsigned char str[] = {0xde, 0xad, 0x2b, 0x6f};

char buf[16] = {0};

unsigned char ubuf[16] = { 0 };

//打印无符号的字符

memcpy (buf, str, 4);

printf ("0buf is:0x%x\n", buf[0]);

printf ("1buf is:0x%x\n", buf[1]);

printf ("2buf is:0x%x\n", buf[2]);

printf ("3buf is:0x%x\n", buf[3]);

//打印有符号的字符

memcpy (ubuf, str, 4);

printf ("0ubuf is:0x%x\n", ubuf[0]);

printf ("1ubuf is:0x%x\n", ubuf[1]);

printf ("2ubuf is:0x%x\n", ubuf[2]);

printf ("3ubuf is:0x%x\n", ubuf[3]);

return 0;

}

打印结果:

0buf is:0xffffffde

1buf is:0xffffffad

2buf is:0x2b

3buf is:0x6f

0ubuf is:0xde

1ubuf is:0xad

2ubuf is:0x2b

3ubuf is:0x6f

说明

上面的结果反映了一个情况是 :str 的前两个字符,在有符号和无符号打印的时候是不同的

为什么不同?

因为前两个字符的二进制最高位是 1

其他的字符在有符号和无符号时结果不影响,是二进制的最高位是0

注意点:

这个会有一个潜在的陷阱问题,就是做字符比较的时候

接着上面的例子:

有符号时

0xde == buf[0] =》 不成立

0xad == buf[1] =》 不成立

0x2b == buf[2] =》 成立

0x6f == buf[3] =》 成立

无符号时

0xde == ubuf[0] =》 成立

0xad == ubuf[1] =》 成立

0x2b == ubuf[2] =》 成立

0x6f == ubuf[3] =》 成立

总结

1. 在一般做字符操作的时候,需要区分无符号和有符号的情况。

2. 为了避免错误,程序中如果存在字符比较的时候,必须定义为无符号字符

3. 网络编程中的字符定义一般都为无符号的字符,这个是因为存在大量的字符比较

时间: 2024-10-11 13:25:00

关于 char 和 unsigned char 的区别的相关文章

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个数字. 在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文

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

char与unsigned char本质区别

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个数字. 在实际使用过程种

c语言中 char* 和 unsigned char* 的区别浅析(转)

原文:https://blog.csdn.net/guotianqing/article/details/77341657 背景最近在项目中遇到了一个编译警告,是因为定义的变量为char[],而在使用时作为函数的unsigned char*类型的参数调用.这个警告很容易避免,但是char*和unsigned char*到底有什么区别呢,本文作一个简单的探讨. char 和 unsigned char 的区别在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的.

C语言中char和unsigned char的区别

在C中,默认的基础数据类型均为signed,如定义变量为int,long等,都为有符号的.如果要定义无符号类型,必须显式地在变量类型前加unsigned. char在我所用的linux中一般都是8位一个字节,表示范围为-128~127. unsigned char的表示范围为0~255. 而ASCII的最大值是127.因此我们如果使用char去表示字符,那么char和unsigned char是没有区别的. 当然如果去表示超过127的数,那么就会差别的. 但是看过别人的一个博客,里面有指出,把一

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个数字. 在实际使用过程种有什么区别呢? 主要是符号位,但是在普通的赋值,读写

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

C语言 —— char与unsigned char

1 #include <stdio.h> 2 int main() 3 { 4 unsigned char a = 128; 5 char b = a; 6 printf("a = %d , b = %d",a,b); 7 return 0; 8 } 输出结果为 a = 128 , b = -128. 128的二进制表示为1000 0000 因为char是有符号类型,所以编译器把128,即1000 0000当成有符号数,即补码为1000 0000 (因为计算机中的有符号数都