无符号数和有符号数的转化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了无符号数和有符号数的转化相关的知识,希望对你有一定的参考价值。

下面的代码输出是什么,为什么?
void foo(void)

unsigned int a = 6;
int b = -20;
(a+b > 6) ? puts("> 6") : puts("<= 6");
结果是多少?
int b是unsingned int 还是signed int (我认为默认情况应该是无符号数)

语言有符号数与无符号数之间的转换:

无符号数:不存在正负之分,所有位都用来表示数的本身。

有符号数:最高位用来表示数的正负,最高位为1则表示负数,最高位为0则表示正数。

1. 无符号数转换为有符号数:看无符号数的最高位是否为1,如果不为1(即为0),则有符号数就直接等于无符号数;

2.如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。

3..有符号数转换为无符号数 :看有符号数的最高位是否为1,如果不为1(即为0),则无符号数就直接等于有符号数;

4.如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。

拓展资料:

1.有符号数是针对二进制来讲的。用最高位作为符号位,“0”代表“+”,“1”代表“-” ;其余数位用作数值位,代表数值。

2.有符号数的表示:计算机中的数据用二进制表示,数的符号也只能用0/1表示。一般用最高有效位(MSB)来表示数的符号,正数用0表示,负数用1表示。

3.有符号数的编码方式,常用的是补码,另外还有原码和反码等。用不同二进制编码方式表示有符号数时,所得到的机器数可能不一样,但是真值是相同的。

参考资料:百度百科_有符号数

参考技术A LZ要仔细看书
int就是有符号的
unsigned int才是无符号的

数据类型转换的原则及注意问题

一、两条自动转换原则和一条强制性转换原则。

设:x为短整型(2B),y单精度型(4B),z为字符型(1B)。

1、表达式计算中数据类型的自动转换原则
参加运算的各个数据都转换成长度最长的数据类型。结果为数据长度最长的数据类型。例如:
① x+y x先自动转换成单精度型,后计算x+y,结果为单精度型;
② x+z z先自动转换成短整型,后计算x+z,结果为短整型。

2、把运算结果赋给变量时数据类型的自动转换原则
先将运算结果的数据类型自动转换成变量的数据类型,然后赋给变量。例如:
① y=x+z x+z运算结果为短整型,自动转换成单精度型,再赋给变量 y.
② x=y+z y+z运算结果为单精度型,自动转换成短整型,再赋给变量 x.

3、运算结果的强制性数据类型转换原则
强制性数据类型转换格式:(数据类型符)(表达式)
先按自动转换原则计算表达式的值,后将其转换成指定的数据类型。
仅当表达式是单个常量或变量时,表达式括号可省略。例如:
①(float)x 对 x 的值强制转换成单精度;
②(float)x+m 先对 x 的值强制转换成单精度,后再和 m 进行加运算;
③(float)(x+m) 先计算(x+m),后把(x+m)的值强制转换成单精度。

二、类型转换的注意问题

1、表达式的类型转换是临时的,式中的常量或变量的原类型均不改变。

2、把运算结果赋给变量时,若运算结果的数据长度 > 变量的数据长度,会截去超长部分,
将可能导致精度降低或产生不确定的值。

3、类型转换占用系统时间,过多的转换会降低程序运行效率。除必要的外,应选择合适的数据类型。

main()

char a;
int x;
x=32767; /* x 的机内码 01111111 11111111 */
a=x; /* a 的机内码(p31) 11111111 */

printf("a=%3d x=%d\n",a,x); /* a 的原码 10000001 = -1 */
/* x 的原码 01111111 11111111 = 32767 */

a=x>>8; /* a 的原码 01111111 = 127 */
printf("a=%3d x=%d\n",a,x); /* x 的原码 01111111 11111111 = 32767 */
本回答被提问者采纳
参考技术B unsingned int 优先级高
计算a+b会转化为unsingned int

输出是>6
参考技术C 无符号数和有符号数的转化?
同样字长的无符号数、有符号数,两者表示范围不一样。

转换之后,还能相等吗?
参考技术D 语言有符号数与无符号数之间的转换:

无符号数:不存在正负之分,所有位都用来表示数的本身。
有符号数:最高位用来表示数的正负,最高位为1则表示负数,最高位为0则表示正数。

1 无符号数转换为有符号数
看无符号数的最高位是否为1,如果不为1(即为0),则有符号数就直接等于无符号数;如果无符号数的最高位为1,则将无符号数取补码,得到的数就是有符号数。

2 有符号数转换为无符号数
看有符号数的最高位是否为1,如果不为1(即为0),则无符号数就直接等于有符号数;如果有符号数的最高位为1,则将有符号数取补码,得到的数就是无符号数。

有符号数和无符号数

  数据类型的最高位用于标识数据的符号

最高位为1,表明这个数为负数

最高位为0,表明这个数为正数


   在计算机内部,用补码表示有符号数

----正数的补码为正数本身

----负数的补码为改数的绝对值各位取反后加1


  在计算机内部用原码表示无符号数

----无符号数默认为正数

-----无符号数没有符号位


  对于固定长度的无符号数

----MAX_VALUE+1-------->MIN_VALUE

----MIN_VALUE - 1-------->MAX_VALUE

   unsigned 将变量声明为无符号类型

   在C语言中,只有整数类型才能声明为unsigned类型

   当一个有符号数和一个无符号数进行运算时,有符号数将会被当做无符号数进行运算。也就是说,当有符号数为负数时,那么这个有符号的负数和一个无符号数运算时,它就变成了一个很大的正数。

----当无符号数和有符号数混合计算时,会将有符号数转换为无符号数后再进行运算,结果为无符号数。


本文出自 “梵高说我脑子有病” 博客,谢绝转载!

以上是关于无符号数和有符号数的转化的主要内容,如果未能解决你的问题,请参考以下文章

有符号数和无符号数

有符号数与无符号数之间运算问题探究

有符号数与无符号数之间运算问题探究

谁能给我细细解释下无符号数和有符号数怎么表示,怎么输出,怎么进行转换,及其他相关内容

有符号数和无符号数在一起如何处理的

java中如何将有符号数转化成无符号数