为什么unsign int i=0xffffffff这个等于-1,不是无符号数么

作者&投稿:慕律 (若有异议请与网页底部的电邮联系)
unsigned int i = -1; 内存中的值是0xffffffff的。为什么?类型转换具体如何实现的?~

很简单,这个主要是因为补码的方式,这个问题是从位级的角度来看的。
补码怎么表示-1呢?比如说用两位来表示就是 11, 三位就是111,4位就是1111。最高位权重为 -1; 分别 -1 = 1*(-2) + 1, -1 = 1*(-2^2) + 1* 2^1 +1 *2^0, -1 = 1*(- 2^3) + 1*(2^2)+1*(2^1)+1*(2^0)
可知32位情况下 -1 表示为 0xffffffff,这个值对于无符号数来说就是极大值。可以发现在位级上面是没有发生变化的,发生转换的只是怎么样去解释这一片内存的规则而已。

刚开始-1被识别为int类型,但是unsigned * int,int类型会被隐式转化为unsigned类型,-1的位级表示是0xFFFFFFFF,于是这里两个unsinged类型的相乘。0xFFFFFFFF * 0x3 = 0x2FFFFFFFD,由于是取其商,商为32位,因此对于乘得的结果进行阶段,留下32位,即0xFFFFFFFD,由于是%u,解释为unsigned类型,十进制显示为4294967293。

输出值为-1。 原因: 1、在C语言中整型常量的数据类型默认为int,所以unsigned int a = -1中,-1的类型是int类型。实际上是有一个隐式转换,即将int类型转成unsigned int类型。 这个转换的意义不大,因为没有超出unsigned类型的表示范围


阳明区19251669399: 为什么说i是未声明的标示符! if(i*h>MAXarea)开始以及下面出现的i都未申明. -
屠冉猴菇: 在所有函数之外定义unsigned int i(即这句话不被任何函数包含,比如在头文件下面定义)使i变为全局变量,这样每一个函数都能使用它,然后把 for(unsigned int i=0;i<w;i++) 改成for( i=0;i<w;i++) 照我的方法改应该没问题,望采纳!

阳明区19251669399: unsigned int I=0; for(;i<50 000;I++); 这是什么意思啊.那个五 -
屠冉猴菇: 代码贴一下~ 如果就这一段的话~就是for(;i<50 000;I++); 第一个参数是空,代表的是里面的i使用外面的i~不进行初始化~,这时候要保证外面的i必须初始化,不然就报错~ 第二个如果我没数错的话应该是5万,代表程序运行到5万~ 第三个i++代表每次增加1,程序共运行50000词

阳明区19251669399: java问题:为什么int i=0;i=i++;i的值是0;而int i=0;i++;或int i=0;i=++i;i的值是1,请高手讲解下,谢谢. -
屠冉猴菇: 1,int i = 0; i此时就是0 2,i++这个返回值是0 用过后注意此时i为1 3,但你将i=i++(注意:i++这个返回值是0);又重新将i值赋为0所以最后i的结果就是0 而int i=0;i++;或int i=0;i=++i; 同上面的2此时i的值已经为1了,你也没做重新赋值的操作.所以结果是1

阳明区19251669399: int i=0;i=~i;结果为什么是 - 1 -
屠冉猴菇: 这两句语句涉及到以下几方面知识:1 int i = 0; 定义一个有符号型的整型变量,初始化值为0. 2 i = ~i; 将i按位取反,将结果赋值给i. ~符号是单目运算符,代表按位取反,结果的每位值和原始值均相反,即原本为1结果为0,原本为0,结果...

阳明区19251669399: C语言里,一个函数前加(unsign int)是什么意思,如add是个函数,a是个变量,然后a=(unsign int)add; -
屠冉猴菇: 这个的意思是将函数的返回值的类型强制转换为unsigned int.因为c语言是强类型语言,要求每个变量都得有特定的类型,不同的类型一般来说是有限制的,这是因为类型不同,所占的存储空间不一样,比如一般来说,int型占两个字节,char型占一个字节.这里是将add这个函数的返回值硬性的变为unsigned int型.

阳明区19251669399: #include "stdio.h" void main() {int i=0,b=i++; printf("b=%d,i=%d",b,i); } 为什么结果是b=0,i=1 ?
屠冉猴菇: int i=0; //把0赋值给i,此时i的值为0;int b=i++; //由于i++是先赋值后自增,所以先把0赋值给b,b的值是0,然后i进行自增运算,i的值是1;printf("b=%d,i=%d",b,i); 输出b则是0,i则是1;

阳明区19251669399: 在c语言中int i=u=0这样定义变量正确吗? -
屠冉猴菇: 错,定义变量不能这样写,如果做赋值运算就可以写成 i=u=0

阳明区19251669399: int i = 0 ; i = i++ ; System.out.println(i); 为什么是输出零呢?很不解 -
屠冉猴菇: i = 0; i = i++; 在java里面,执行后i=0; 在c里面,执行后i=1. 这也算是java与c的实现方式上的一点不同之处吧. 原因: java的实现方法: i = i++; 等价于: tmp = i; i = i + 1; i = tmp; c的实现方法: i = i++; 等价于: tmp = i; i = tmp; i = i + 1; 差别在于:java先++, 然后给左边赋值, 而c先给左边赋值,再++

阳明区19251669399: extern int i=0; -
屠冉猴菇: extern int i=0; /*必须定义或声明为全局变量,而不能是局部变量,你这里定义成局部变量了,你应该把这行语句放到main函数体外*/

阳明区19251669399: 为什么循环语句里int i=0给变量定义数据类型反倒报错? -
屠冉猴菇: js中没有int数据类型,当然会报错,var i=0才行,js中的所有变量申明都用var,没有特别的区分

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网