找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4049|回复: 10
收起左侧

unsigned char 和 signed char的使用疑惑

[复制链接]
ID:521921 发表于 2019-6-3 09:47 | 显示全部楼层 |阅读模式
各位大咖,我是小白,有个疑问请教下:

以下这个代码中,i用的是signed char,可以改成用unsigned char吗?为什么?我一直搞不懂什么时候该用unsigned char,什么时候该用signed char。谢谢!

void ShowNumber(unsigned long num)
{
   signed char i;
   unsigned char buf[6];

    for(i=0; i<6; i++)   //把长整型数转换为6位十进制的数组
   {
       buf[i] = num % 10;
       num = num / 10;
   }
    for(i=5; i>=1; i--)   //从最高位起,遇到0转换为空格,遇到非0则退出循环
   {
       if(buf[i] == 0)
              LedBuff[i] = 0xFF;
       else
              break;
   }

    for( ; i >= 0; i--)   //剩余低位都如实转换为数码管显示字符
    {
          LedBuff[i] = LedChar[ buf[i] ];
    }
}
回复

使用道具 举报

ID:93224 发表于 2019-6-3 13:20 | 显示全部楼层
一个是有符号的范围是-128 - 127; 一个是无符号的 范围是 0 - 255
回复

使用道具 举报

ID:517466 发表于 2019-6-3 13:54 | 显示全部楼层
对于一个字节宽度的变量:
范围介于0~255的,使用unsigned。
范围介于-128~127的,使用signed。
回复

使用道具 举报

ID:309376 发表于 2019-6-3 16:13 | 显示全部楼层
unsigned:无符号的;unsigned char数据范围为0~255;
signed:有符号的;signed char数据范围是-128~127;
两个的使用取决于你要使用的数据的范围,当要用到负数时且范围不超过-128时,使用signed char;当不用到负数且范围不超过255时,使用unsigned char
回复

使用道具 举报

ID:511890 发表于 2019-6-3 17:10 | 显示全部楼层
signed 是有符号的,也就是有负值。unsigned是无符号的,没有负值。在某些情况下,for循环只能用有符号的。其实我觉得for循环中的循环变量最好用有符号数 char不够用用int,再不够用long。除非必要,最好不要用unsigned的变量。给大家一个有趣的程序玩玩(是在VS2017上写的,要换其它编译软件,只要把pch.h改成相应的头文件就行,一般好像是studio.h):
#include "pch.h"
#include <iostream>
using namespace std;


int main()
{
//        unsigned char i;//i换成unsigned char型就会变成死循环
        signed char i;
        for (i = 7; i > 0; i--) {
                cout << "i=" <<int(i) << endl;
                i--;
        }
   
}
回复

使用道具 举报

ID:554056 发表于 2019-6-3 20:29 来自手机 | 显示全部楼层
unsigned char的数据范围是0~255,unsigned int数据范围是–128~127存在负值。适用范围不同,如果用到复数就用unsigned char
回复

使用道具 举报

ID:554183 发表于 2019-6-3 22:01 | 显示全部楼层
unsigned是无符号的,unsigned char的数据范围是0到255
signed是有符号的,signed char数据范围是-128到127
具体根据你的使用来
回复

使用道具 举报

ID:388197 发表于 2019-6-4 01:13 | 显示全部楼层
unsigned char 的值是0-255
比如
unsigned char a = 0;
unsigned char b = 255;
a--;
b++;
执行后,a为255, b为0.
如果用unsigned 类型的做循环判断变量时,一定要注意不能以 a<0或者 a<=255作为条件,否则就会成死循环.一般循环变量同时用作数组下标时,容易出现这种错误.
回复

使用道具 举报

ID:123289 发表于 2019-6-4 08:44 | 显示全部楼层
本帖最后由 yzwzfyz 于 2019-6-4 11:28 编辑

记住:在芯片内部没有正负之分,它就是个8位二进制数,最小00000000B=0,最大11111111B=255,
如果必须表达负数,怎么办?芯片内部没有“负号”,所以就定义用8位中的首位作为“负号”,且“1”=负,“0”表示正,这样就形成所谓的有符号数了:
正数范围0-0000000B=0,0-1111111B=127,
自然负数的范围就是:1-0000000B至1-1111111B,
负数有两种表示方案:
第一种:1-0000000B=-0=0、1-1111111B=-127;好处是直观,缺点-0=0,与0-0000000B重复,浪费了。其表达范围只有255个数(-127至+127)。
第二种:1-0000000B=-128、1-1111111B=-1;好处是表达范围比第一种多出一个,256个数(-128至+127)。
第二种是标准表达方式!
但不要认为第一种就是错的,在某此场合下它还是比较实用的。这要看你最终是如果翻译。不建议采用第一种,至少目前C不支持它,只能在汇编在应用。
回复

使用道具 举报

ID:521921 发表于 2019-6-5 09:02 | 显示全部楼层
谢谢各位!
回复

使用道具 举报

ID:550032 发表于 2019-6-5 10:03 | 显示全部楼层
unsigned是无符号的,singed是有符号的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表