unsigned int printfa=-1.不是无符号吗,怎么有负号?

细谈有符号与无符号数的区别(一)
&#include&stdio.h&
int main()
unsigned int a=32;
unsigned int c=a+b;
printf("%u",c);
无意看到以上代码,发现自己也是一知半解的,这才决定弄透一点。
以下均为自己对网上资料的理解,希望对大家能有所帮助,有误之处,还请海涵。
首先列举下数据类型:(signed )int ,unsigned int
,float ,double ,char
1.声明无符号整型时,我们都加上unsigned int
,而声明有符号整型时用signed int,
我们平常直接写int,省掉了signed.
另外,unsigned若省略后一个关键字,大多数编译器都会认为是unsigned
2.在计算机中,整数是以补码形式存放的
(只是带符号的整数采用补码存储表示的,浮点数另有其存储方式)。
&3.无符号数没有原码、反码和补码一说。只有带符号数才存在不同的编码方式。
4.整形数运算,总是遵循一个原则:小的往大的扩展
从小到大:short
-& unsigned short -& int
-& unsigned
下面说说各数据类型值的范围
(32 bit Operate System,通过开始——运行,输入DXDIAG
命令即可查到自己电脑系统位数):
&(signed) int & :
&-2^31 ~ 2^31-1(- ~ )
& &unsigned int
&: & &0 ~ 2^32-1
既然只对signed int
才有所谓的原码、反码和补码,那我们就对signed int 来分析,
码制转换规则:当 变量(前提是有符号整型)是非负数时,
&其原码、反码和补码表示都是一样的。
&当变量是负数时,其反码是对原码的除符号位外的其他位进行取反后的结果
& (取反即如果该位为则变为,而该位为则变为的操作)。
& & 而补码是先求原码的反码,
& & 然后在反码的末尾位加后得到的结果,即补码是反码。
& &例如:int a
=32,其原码为0x,反码、补码均如此
&例如:int
a =32,其原码为0x,反码、补码均如此
& int A=-6,其原码为00 00 0000
&(开头的1为符号位),即为0x,
反码即为0xFFFFFFF9,补码即为0xFFFFFFFa(在反码基础上再加1).&
1.码制转换后的数就应该理解成无符号型的了,不然只对有符号型整数转换干嘛
&(即码制转换应用于无符号与有符号之间 的转换问题上)。
&2.要将计算机输出的数值和我们所常用的数值区分开来。
&例如:-(2^31-1)在%u下输出,该值大于2^31-1(但它不是int
&就不要被上面的取值范围给搞迷惑了。
3.符号位也是要占地方的。假如一个8位的系统,a=-6,其原码就该写成1000
& & & 若写成1 0000
0110,就很让人费解,似乎符号位不占空间似的,
& 个人觉得这种写法不合理的,而且我这种写法更有利于理解值的范围。&例如:上面提过int
范围值为&-2^31 ~
2^31-1,若按我的理解,
& 就是int 32位里第一位拿来做符号位,当其为正数时,最大值为31个1,即2^31-1,
当其为负数时,数值部分也是31个1,那最小值应该是-(2^31-1),
& & 为何与上面不一致呢?
&别忘了,开始就说过,计算机存储有符号整数是采用补码形式的。
&即最小值对应的补码是0x,即为,不信你可以运行试试。
&那最小值-2^31是怎么来的?待会儿再想。
&现在再来解释一下上面的小题目,也就容易了:
& & &unsigned
int a=32,其二进制编码为0x
(为了简便,这里用十六进制hexadecimal&&['heksəˌdesiməl]表示)
b=-6,如上已经算出补码0xFFFFFFFa,
& a和b相加,按注意点里第4项看,都往unsigned int 转换。
&二进制相加可得0x0000001a(溢出位去掉),即为26,其为正数,
&所以输出%d,%u格式不会影响结果。
仔细调试该小题,可得如下结果:
& & &1.unsigned
int 变量的值可以直接看成int 型里的正值,
所以上面小题就可以直接看成int型的加减法。
&当输出结果为正值时,输出格式%d,%u都一样,负值当然就不一样了。
&2.如果c为int型,则输出结果要满足是在int型值范围内,
& & &不然可以依然应用
"结果1"法则。
& &若a=,b=-1,结果超出最大值。
&输出格式为%u时,计算向平常的一样,& &
&输出格式为%d时,明显超过了值的范围,电脑会怎么输出,
&本人从运行结果看不出头绪。
大家知道的,可以说说结果-是如何来的?
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。在整型int中,存在有符号型和无符号型,它们分别是sign int和unsigned int
请问它们到底是什么类型? 有什么意思?
signed int和unsigned int 都是整形数,在内存中占2个字节(比如),signed int的16位中最高表示符号,0为正,1为负,低15位表示数值大小,数据范围为:-2的15次方到+2的15次方减1;而unsigned int 的16位中均表示数值大小,没有正负之分,所以数据范围为:0--2的16次方减1。
整数在内存中是以补码得形式存储的
其他答案(共3个回答)
int即是有正负之分的int类型,也就是能够区分正数和负数的int类型。
unsigned int则跟signed int类型相反。unsigned int是没有正负之分的int类型。也就是不区分正数和负数
采用强制类型转化在转化负数时结果是不对的。//如果实在要转换,估计有点麻烦,因为计算机中数据是以补码形式存放的//如果只是想用它的值,如b=-10,而你想用的是...
感觉你概念不太清晰。
字符常量是指用单引号括起来的一个字符。
字符变量是用来存放字符常量的。
常量是不用定义的。看它的特征就能区分它是什么类型的常量。...
这个很简单,使用一个简单的c程序就能找到结果
设置一个整数为-1,然后用printf将二进制打印出来就明白了
如果我的回答有用请点“好评”,您的认可是我助人的...
int(x)函数是取不大于x的最大整数。
你要好好理解这句话中每一个字的含义。举例如下:
int(4.88)=4,因为4是不大于4.88的最大整数
int 是计算不大于参数的最大整数
int 0.6 = 0
int 1.4 = 1
大家还关注
确定举报此问题
举报原因(必选):
广告或垃圾信息
激进时政或意识形态话题
不雅词句或人身攻击
侵犯他人隐私
其它违法和不良信息
报告,这不是个问题
报告原因(必选):
这不是个问题
这个问题分类似乎错了
这个不是我熟悉的地区}

我要回帖

更多关于 unsigned short int 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信