当前位置:首页 » 编程语言 » c语言有符号和无符号赋值
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言有符号和无符号赋值

发布时间: 2023-02-16 04:48:57

① 在c语言中长度相同的有符号与无符号整型数间,原样赋值时为什么值不同

在c语言中无符号(unsigned)和有符号(signed),数据范围不同,无符号和有符号的区别就是有符号类型需要使用一个bit来表示数字的正负,从而导致负数或者超过signed int数据范围时,在两者中的表示值不同,示例代码如下,
#include <stdio.h>

int main(int argc, char *argv[])
{
unsigned a;
int b=-1;
a=b;
printf("%d %d-> %u\n",sizeof(int),b,a);//输出-1 -> 4294967295(0Xffffffff,-1的补码)
a=2147683648;//0X80000000(-2147683648的补码)
b=a;
printf("%d -> %u\n",b,a);//输出-2147683648 -> 2147683648
return 0;
}

win32平台下,无符号(unsigned)和有符号(signed)int都占用4个字节,数值范围如下,
有符号int:-2147683648 到2147683647(- 2^31 到2^31- 1);
无符号int:0到4294967295(0 到2^32 - 1);
无符号类型int能保存2倍于有符号类型的正整数数据,多1个bit位。正数的补码就是其自身,负数的补码是在其原码的基础上, 保持符号位不变, 其余各位求反(反码),最后+1(即在反码的基础上+1)。

② C语言中char类型中的有符号与无符号的区别和意义

在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 <stdio.h>

void f(unsigned char v)
{
char c = v;
unsigned char uc = v;
unsigned int a = c, b = uc;
int i = c, j = uc;
printf("---------------- ");
printf("%%c: %c, %c ", c, uc);
printf("%%X: %X, %X ", c, uc);
printf("%%u: %u, %u ", a, b);
printf("%%d: %d, %d ", 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,都不会做扩展。

③ 在C语言中11种赋值运算符的具体含义,用法

1.=
赋值运算符
变量=表达式
如:a=3;将a的值赋为3
2./=
除后赋值
变量/=表达式
如:a/=3;即a=a/3
3.*=
乘后赋值
变量*=表达式
如:a*=3;即a=a*3
4.%=
取模后赋值
变量%=表达式
如:a%=3;即a=a%3
5.+=
加后赋值
变量+=表达式
如:a+=3;即a=a+3
6.-=
减后赋值
变量-=表达式
如:a-=3;即a=a-3
7.<<=
左移后赋值
变量<<=表达式
左移就是将《左边的数的二进制各位全部左移若干位,《右边的数指定移动位数,高位丢弃,低位补0,
移几位就相当于乘以2的几次方
8.>>=
右移后赋值
变量>>=表达式
右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的
系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
9.&=
按位与后赋值
变量&=表达式
按位与是指:参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。按位与其实与逻辑上“与”的运算规则一致。逻辑上的“与”,要求运算数全真,结果才为真。若,A=true,B=true,则A∩B=true
10.
^=
按位异或后赋值
变量^=表达式
参与运算的两个量按照对应的位进行异或运算,且
0^0→0,
0^1→1,
1^0→1,
1^1→0
此外,一个数与0异或仍保持不变,即a^0=a
一个数与自己异或结果为0,即a^a=0
11.|=
按位或后赋值
变量|=表达式
参与运算的两个量按照对应位进行或运算,且
0|0→0,
0|1→1,
1|0→1,
1|1→1
这些位运算都是与二进制码有关的,所以多弄弄也就会了

④ C语言 赋值问题:为什么有符号赋值给无符号错误呢

a的定义不全,是INT还是float的,规范的写法是unsigned int a;
同时,unsigned定义的是无符号字节型,然后你又把-1赋值给a,那么你最后输出的结果,肯定是a=65535,0-65535的最大值

⑤ C语言中 无符号变量的值赋给有符号的变量

无符号变有符号数,只要有符号数的数据的正数范围比无符号的范围大于或等于即可不会遇到+
-符号的问题,能得到想要的结果。但是有符号数转无符号数就存在正负号问题。要是保证有符号数据直接转成无符号数,存在着正负号问题

⑥ c语言 关于有符号、无符号和补码、原码

在C语言中:只有十进制数有符号,八进制和十六进制没有的,一个数的原码是其二进制数,补码是对原码取反后再加上1,
比如: 5则原码是 101,则反码是010,补码=010+1=011

⑦ C语言中的有符号和无符号是什么意思给仔细讲讲

有符号数 有符号数的实例
有符号数是针对二进制来讲的。 用最高位作为符号位,“0”代表“+”,“1”代表“-”;其余数位用作数值位,代表数值。 有符号数的表示:计算机中的数据用二进制表示,数的符号也只能用0/1表示。一般用最高有效位(MBS)来表示数的符号,正数用0表示,负数用1表示。 有符号数的编码方式,常用的是补码,另外还有原码和反码等。用不同二进制编码方式表示有符号数时,所得到的机器数可能不一样,但是真值应该是相同的。

无符号数【网络.网络搜索】
无符号数是针对二进制来讲的,无符号数的表数范围是非负数。全部二进制均代表数值,没有符号位。即第一个"0"或"1"不表示正负。 无符号数与有符号数相对
C支持所有整形数据类型的有符号数和无符号数运算。尽管C标准并没有指定某种有符号数的表示,但是几乎所有的机器都使用二进制补码。通常,大多数数字默认都使有符号的,C也允许无符号数和有符号数之间的转换,转换原则是基本的位表示保持不变。因此在一台二进制补码机器上,当从无符号数转换为有符号数时,效果就是应用U2Tw,而从有符号转换为无符号数时,就是应用函数T2Uw,其中w表示数据类型的位数。T2Uw(x) = (x<0)?(x+2w) :x;U2Rw(x) = (x<2w-1)?x:(x-2w); 当执行一个运算时,如果它的一个运算数是有符号的而另一个是无符号的,那么C会隐含地将有符号参数强制转换为无符号数,并假设这两个数都是非负的,来执行这个运算。

⑧ 在C语言中11种赋值运算符的具体含义,用法

1.六个变量=表达式的赋值:

=是赋值运算符,/=是除后赋值,*=是乘后赋值,

%=是取模后赋值,+=是加后赋值,-= 是减后赋值,

2.<<=是左移后赋值,变量<<=表达式 左移就是将左边的数的二进制各位全部左移若干位,右边的数指定移动位数,高位丢弃,低位补0, 移几位就相当于乘以2的几次方。

3.>>=是右移后,变量>>=表达式,右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。

对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”);

对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。

如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统,系统移入0或系统移入1。

移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。

4.&= 按位与后,变量&=表达式,按位与是指:参加运算的两个数据,按二进制位进行“与”运算。

如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。

5.^= 按位异或后赋值,变量^=表达式,参与运算的两个量按照对应的位进行异或运算,且
0^0→0, 0^1→1, 1^0→1, 1^1→0

一个数与0异或仍保持不变,如a^0=a
一个数与自己异或结果为0,如a^a=0

11.|=是按位或后赋值,变量|=表达式,参与运算的两个量按照对应位进行或运算,且0|0→0, 0|1→1, 1|0→1, 1|1→1。

(8)c语言有符号和无符号赋值扩展阅读:

1.赋值表达式的功能是计算表达式的值再赋予左边的变量。

赋值运算符具有右结合性,因此a=b=c=5可理解为a=(b=(c=5))。

2.在其它高级语言中赋值构成了一个语句,称为赋值语句;

而在C语言中,

把“=”定义为运算符,从而组成赋值表达式。

3.凡是表达式可以出现的地方均可出现赋值表达式。

例如:式子x=(a=5)+(b=8)是合法的。它的意义是把5赋予a,8赋予b,再把a,b相加,和赋予x,故x应等于13。

4.在C语言中也可以组成赋值语句。

按照C语言规定,任何表达式在其未尾加上分号就构成为语句。

⑨ C语言中 无符号变量的值赋给有符号的变量

无符号变有符号数,只要有符号数的数据的正数范围比无符号的范围大于或等于即可不会遇到+ -符号的问题,能得到想要的结果。但是有符号数转无符号数就存在正负号问题。要是保证有符号数据直接转成无符号数,存在着正负号问题

⑩ C语言中 无符号变量的值赋给有符号的变量

用强制转换。
unsigned 变 long,short, 数值可能超界,就会得到不正确的结果,需要仔细处理。
正如 double 变 int 数值可能超界,需要仔细处理。

unsigned long int a=0xa900;
long b;
short c;
b = (long) a;
printf("%d\n",b);
c = (short) a;
printf("%d\n",c);