char和unsigned char和汉字

本文深入探讨了字符编码中char与unsigned char的区别,包括它们在内存中的表现形式、使用场景及如何处理汉字编码等内容。通过实例代码展示了不同字符类型在位运算、汉字处理等方面的应用。

1.

一个汉字的GB编码为2个字节,高字节的最高位为1,即高字节>127。通常需要转换为unsigned char进行判断,请大家注意这一点。如: 

while (*p) 

 if ((unsigned char)*p > 127)  //汉字 
  { 
    p += 2; 
  } 
else  //标准的ASCII字符 
  { 
    p += 1; 
  } 
}

2. char和unsigned char有什么区别,什么时候用char什么时候用unsigned char?

  答:本质上都是8位,即一个字节。char会把最高位当作符号位,unsigned char则全部用作正数位数,于是产生了-128~127和0~255的范  围区别。

   什么时候用unsigned char呢?如果你想拿这8个位做位运算就需要用unsigned char。若你是以char读取这8个字节,由于最高位被当作符号位,若位运算大于127就会溢出。

   记得有一个陷阱, 当 unsigned char x=255时, x++之后, x的值变为0了。

  char 和 unsigned char是无符号的 

两者都作为字符用的话是没有区别的,但当整数用时有区别: 
char 整数范围为-128到127( 0x80__0x7F),  
而unsigned char 整数范围为0到255( 0__0xFF ) 

多数情况下,char ,signed char 、unsigned char 类型的数据具有相同的特性然而当你把一个单字节的数赋给一个大整型 数域时,便会看到它们在符号扩展上的差异。另一个区别表现在当把一个介于128和255之间的数赋给signed char 变量时编译器必须先进行数值转化,同样还会出现警告。若使用十六进制进行赋值使用unsigned char 要方便一些.根据编译器具体实现情况不同,char要么和signed char等同,要么和unsigned char等同.

3.同一个内存内容:10010000  

  你用char*  解释是-112  
  你用unsigned  char*  解释是144  
  还是同样这个内存内容赋给整型值,用unsigned  char  类型还是会得到144,用char类型的就会是负数。

4.#include <stdio.h>

int main() 

{

  char x=0x80;

  unsigned char y = 0x80;

  unsigned char z[]="你好";

  printf("x=%d, HEX=%2X, (x>>1)=%d, HEX=%2X./n", x, x, x>>1, x>>1);

  printf("y=%d, HEX=%2X, (y>>1)=%d, HEX=%2X./n", y, y, y>>1, y>>1);

  printf("%s =", z);

  for (x=0; x<4; ++x) printf(" %02X", z[x]);

  printf("/n");

  return 0; 

}

5.

#include <iostream.h>

 

int main()

{

   unsigned char sz[]="012254我的未来";

int nhz;

sz[3]=100;

char szchinese[3]="/0";

 

for (int i=0;sz[i]!='/0';i++)

{

if (sz[i]>0x80)

{

szchinese[0]=sz[i];

szchinese[1]=sz[i+1];

i++;

cout<<szchinese<<endl;

}

 

//nhz=sz[i];

}

 

return 0;

}

 
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值