signed char 和char有啥区别??? 30

另外,#include<iostream.h>voidf(charc){cout<<c<<endl;}voidg(char&c){cout<<c<<endl;}intma... 另外,
#include <iostream.h>

void f(char c) { cout<<c<<endl;}
void g(char &c) { cout<<c<<endl;}

int main()
{
char c;
signed char sc;

f(c);
f(sc);

g(c);
g(sc);//!!!错误:unsigned char->char产生右值
//不理解这个错误是什么意思..帮忙解释一下,谢谢

return 0;
}
而且调用f(sc)时却没有错误,为什么???

不好意思写错个地方 !!!

上面补充处应该是signed char->char产生右值

最好能讲的通俗易懂些
展开
 我来答
bai与du
2009-04-15 · TA获得超过329个赞
知道答主
回答量:84
采纳率:0%
帮助的人:76.5万
展开全部
某些编译器中,char 默认是有符号的(signed)。对于这类型的编译器来说,char 的表示范围通常是 -128 到 127 。而另外一些编译器中,char 默认是无符号的(unsigned)。对于这类型的编译器来说,char 的表示范围通常是 0 到 255 。一般来说,编译器的使用说明会注明它默认把 char 当作有符号的还是无符号的。

从 C89 开始,我们可以使用关键字 signed 和 unsigned 来修饰 char 。这么一来,无论编译器默认 char 是有符号的也好,无符号的也罢,我们都可以用 signed char 表示有符号 char ,也可以用 unsigned char 表示无符号 char 。

////////////////////////////////////////////////////////////////
在定义整数变量的型态的时候可以加上 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);

就会自动做转换
////////////////////////////////////////////////////////////
参考:http://blog.csdn.net/cugbliang/archive/2008/07/16/2657161.aspx
哈伦德拉
2009-04-04 · TA获得超过124个赞
知道小有建树答主
回答量:133
采纳率:0%
帮助的人:0
展开全部
A reference that is not to 'const' cannot be bound to a non-lvalue
非常量的引用不能绑定于一个非左值,加个const就行了
void g(const char &c) { cout<<c<<endl;}
不过我也不理解char不是等同于signed char吗?
出现这个问题说明两者还是不等,把signed char到char出现了类型转换,所以出现了sc的拷贝,所以不能改变sc的内容,必须定义成const类型引用.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
包桂花钱丑
2019-04-22 · TA获得超过3.8万个赞
知道大有可为答主
回答量:1.4万
采纳率:27%
帮助的人:835万
展开全部
A
reference
that
is
not
to
'const'
cannot
be
bound
to
a
non-lvalue
非常量的引用不能绑定于一个非左值,加个const就行了
void
g(const
char
&c)
{
cout<<c<<endl;}
不过我也不理解char不是等同于signed
char吗?
出现这个问题说明两者还是不等,把signed
char到char出现了类型转换,所以出现了sc的拷贝,所以不能改变sc的内容,必须定义成const类型引用.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
zhangyafei3020
2009-04-04 · TA获得超过418个赞
知道小有建树答主
回答量:474
采纳率:0%
帮助的人:0
展开全部
//欢迎在线讨论
#include <iostream.h>

void f(char c) { cout<<c<<endl;}
void g(char &c) { cout<<c<<endl;}
void g(signed char &c) { cout<<c<<endl;}

int main()
{
char c;
signed char sc;

f(c);
f(sc);

g(c);
g(sc);

return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友81a812545
2009-04-04 · TA获得超过798个赞
知道大有可为答主
回答量:310
采纳率:0%
帮助的人:242万
展开全部
signed是带符号的吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式