[转] Unsigned VS signed

在定义整数变量的型态的时候可以加上 unsigned 或是 signed, 例如

unsigned char

unsigned short (int)

unsigned long (int)

unsigned int

----------

signed char

signed short (int)

signed long (int)

signed int

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

上面 signed 有加和没有加是一样的意义

加上 unsigned 以后,

 

1. 所需要的数据储存空间和没有加 unsigned 时是一样的

2. 在使用 printf() 打印时基本上你必须分清楚

   unsigned 有影响到的是参数的传递, 使用 %d 或是

   %u 基本上是看程序设计者自己的选择

   int i=-1;

   printf("%d %u/n", i, i);

   会印出

   -1 4294967295

 

   unsigned int i=-1;

   printf("%d %u/n", i, i);

   也会印出

   -1 4294967295

 

   char i=-1;

   printf("%d %u/n", i, i);

 

   还是会印出

   -1 4294967295

 

   但是

   unsigned char i=-1;

   printf("%d %u/n", i, i);

   则会印出

   255 255

   这不是 %d %u 的问题, 而是

   参数传递时数据转换的问题 (见下面第 3 )

 

不一样的地方有下面几个

 

1. 数据的范围基本上加上 unsigned 以后会变成 2

 

2. 程序里比较大小的时候

 

   int i=1;

   int j=-1;

   if (i>j) printf("i>j/n");

   else printf("i<=j/n");

   你会发现结果是 i>j

 

   unsigned int i=1;

   int j=-1;

   if (i>j) printf("i>j/n");

   else printf("i<=j/n");

   你会发现结果是 i<=j

 

   也就是说 signed unsigned 在比较的时候 compiler

   会把 signed int 自动当成 unsigned int 来比较

 

2. 数据转换的时候 (或是函式呼叫的时候)

   char i = -128;

   int j = i;

   变量 i 里面的数据只有 1 个字节, 要放进

   变量 j 里面的时候需要做 sign extension

   也就是多出来的 3 个字节 (24 bit) 都要

   填入原来 i sign bit ( 8 bit)

   以上例来说 (用二进制表示)

   i: 10000000

   j: 11111111 11111111 11111111 10000000

 

   unsigned char i = -128;

   int j = i;

   unsigned 转为 signed 时前面一率补 0

   用二进制表示

   i: 10000000

   j: 00000000 00000000 00000000 10000000

 

   char i = -128;

   unsigned int j = i;

   还是做 sign extension

   用二进制表示

   i: 10000000

   j: 11111111 11111111 11111111 10000000

 

   函式呼叫的时候会做型态的转变, 例如

   void fun(int x)

   {

     ...

   }

   呼叫时如果用

   unsigned char i=-1;

   fun(i);

   就会自动做转换

 

unsigned char VS signed char

C51初期 /xmm1981 

[补:VS上的char是signed char实现]

 

Character values of type unsigned char have a range from 0 to 0xFF hexadecimal. A signed char has range 0x80 to 0x7F. These ranges translate to 0 to 255 decimal, and –128 to +127 decimal, respectively. The /J compiler option changes the default from signed to unsigned.

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等同.

功能:统计字符串里面的汉字的个数 (gb2312编码内码大于0xa0)

char szText[]= "12345你好";

l= strlen(szText);
int sum=0;
for (int i=0; i< l; i++)
if (szText[i] > 0xa0)
sum++;
sum/=2;

这样你根本统计出到任何汉字,
因为char是有符号的,打最大就是127,超过就变成复数了。比如7f 是127,那么80就是-1了。
这时候你一定要写成
unsigned char szText[]= "12345你好";
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值