有符号和无符号有什么区别?
你会这样问,应该是在看C吧?
=====
当表达式中存在有符号类型和无符号类型时所有的操作数都自动转换为无符号类型。
因此,从这个意义上讲,无符号数的运算优先级要高于有符号数,这一点对于应当频繁用到无符号数据类型的嵌入式系统来说是丰常重要的。
首先进行一个实验,分别定义一个signed int型数据和unsigned int型数据,然后进行大小比较:
unsigned int a=20;
signed int b=-130;
a>b?还是b>a?实验证明b>a,也就是说-130>20,为什么会出现这样的结果呢?
这是因为在C语言操作中,如果遇到无符号数与有符号数之间的操作,编译器会自动转化为无符号数来进行处理,因此a=20,b=4294967166,这样比较下去当然b>a了。
=====
而对于浮点数来说,浮点数(float,double)实际上都是有符号数,unsigned 和signed前缀不能加在float和double之上,当然就不存在有符号数根无符号数之间转化的问题了。
汇编语言中的有符号数和无符号数有区别吗?怎么知道是有符号数和无符号数?
在C中,默认的基础数据类型均为signed,现在我们以char为例,说明(signed)
char与unsigned
char之间的区别。
首先在内存中,char与unsigned
char没有什么不同,都是一个字节,唯一的区别是,char的最高位为符号位,因此char能表示-127~127,unsigned
char没有符号位,因此能表示0~255,这个好理解,8个bit,最多256种情况,因此无论如何都能表示256个数字。
在实际使用过程种有什么区别呢?主要是符号位,但是在普通的赋值,读写文件和网络字节流都没什么区别,反正就是一个字节,不管最高位是什么,最终的读取结果都一样,只是你怎么理解最高位而已,在屏幕上面的显示可能不一样。
二者的最大区别是:但是我们却发现在表示byte时,都用unsigned
char,这是为什么呢?首先我们通常意义上理解,byte没有什么符号位之说,更重要的是如果将byte的值赋给int,long等数据类型时,系统会做一些额外的工作。如果是char,那么系统认为最高位是符号位,而int可能是16或者32位,那么会对最高位进行扩展(注意,赋给unsigned
int也会扩展)而如果是unsigned
char,那么不会扩展。最高位若为0时,二者没有区别,若为1时,则有区别了。同理可以推导到其它的类型,比如short,
unsigned
short,等等。
具体可以通过下面的小例子看看其区别include
void
f(unsigned
char
v)
{
char
c
=
v;
unsigned
char
uc
=
v;
unsigned
int
a
=
c,
b
=
uc;
int
i
=
c,
j
=
uc;
printf("----------------\n");
printf("%%c:
%c,
%c\n",
c,
uc);
printf("%%X:
%X,
%X\n",
c,
uc);
printf("%%u:
%u,
%u\n",
a,
b);
printf("%%d:
%d,
%d\n",
i,
j);
}
int
main(int
argc,
char
*argv[])
{
f(0x80);
f(0x7F);
return
0;
}
结果输出如下: 结果分析:对于(signed)char来说,0x80用二进制表示为1000
0000,当它作为char赋值给unsigned
int或
int
时,系统认为最高位是符号位,会对最高位进行扩展。而0x7F用二进制表示为0111
1111,最高位为0,不会扩展。
对于unsigned
char来说,不管最高位是0,还是1,都不会做扩展。
有符号数和无符号数有区别吗?
--使用汇编语言编写程序时,数字是写给人看的,有正负号(+、-),就是有符号数。
--没有,则是无符号数。
--这些数字,经过编译,生成了机器码,这就是给CPU看的,这时,就没有区别了。
怎么知道是有符号数和无符号数?
--程序中的数,看符号即可。
--如果是机器码,分不清楚的,谁存的,谁才能知道。
鹏仔微信 15129739599 鹏仔QQ344225443 鹏仔前端 pjxi.com 共享博客 sharedbk.com
图片声明:本站部分配图来自网络。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!