J2ME中>>和>>>以及C中的数据类型

49 篇文章 0 订阅
35 篇文章 0 订阅

今天李老师有事,让我临时给她代一下关于闪屏渐变的课,其中有这么一段代码:

/**
   *渐变闪屏控制线程
   */
  public void run() {
    while (running) {
      switch (index) {
        case 0:
          flashTime++;
          if (flashTime == 30) {
            index = 1;
          }
          break;
        case 1:
 
          /* 改变渐变图片每一个像素的透明度alpha值 */
          for (int i = 0; i < shadowRgbImg2.length; i++) {
            int alpha = (shadowRgbImg2[i] & 0xff000000) >>> 24; // 获取渐变图片的某一像素的alpha值
            int oldAlpha = (srcRgbImg2[i] & 0xff000000) >>> 24; // 原始图片的对应像素的alpha值
            if (alpha < oldAlpha) {
              shadowRgbImg2[i] = ( (alpha + 1) << 24) |
                  (shadowRgbImg2[i] & 0x00ffffff); //增加alpha值
            }
            else {
              running = false; //停止线程
            }
          }
          break;
      }
      repaint(); //重绘
      try {
        Thread.sleep(50);
      }
      catch (InterruptedException e) {
        e.printStackTrace();
      }
 
    }
  }
 


程序中核心的代码,也是比较难理解的代码是:

 int alpha = (shadowRgbImg2[i] & 0xff000000) >>> 24; // 获取渐变图片的某一像素的alpha值

  int oldAlpha = (srcRgbImg2[i] & 0xff000000) >>> 24; // 原始图片的对应像素的alpha值

 

这代码>>>24说实话我还是第一次见到,我以为其实和>>24效果一样,是写错了呢,不过当我右移操作24位后,用>>就不发生透明度改变,用>>>就可以,不知道为什么。上网查也没查出这个相关解释。后来我输出了alpha和oldAlpha的值才发现问题,用>>>表示的时候,值是0和255,用>>表示的时候,值是0和-1,为什么0没有改变,而255变为-1了呢?很自然的想到,255和-1以及256的关系,立即,我就明白了,估计是和有符号和无符号有关!后来我实验了一下:

 

         int a=0xacaabbcc;
         int b = a>>24;
         int c = a>>>24;
         System.out.println(a);  //很大的数
         System.out.println("shi\n");
         System.out.println(b); //0Xac  输出为-84
         System.out.println("shi\n");
         System.out.println(c); //0Xac  输出为172


结果可想而知,下面推证一下:

0xAC二进制码是 1010 1100

直接表达的无符号数是:128+32+8+4=172

若按有符号表示,第一位应该是符号位,1表示符号,后面是010 1100,取反后:1010011,再加1,所以得到:1010100,即64+16+4=84,加上符号,其代表的值就是-84,正好为我们的输出结果。

所以总结一下:在J2ME中>>>和>>都是移位操作,>>>表示的移位后按无符号表示数,>>是按照有符号数表示。当然,如果移位后首位为0,即为正数的话,两个操作的值是相等的。

 

同样,在C语言中,根据数据的类型不一样,其表示的结果也不一样的。哪怕是存储同样的东西,比如:

       int a = 0x800000AC;//为了首地址为1,是负数且四个字节
       int* p=&a;
       unsigned int b = 0x800000AC;
       unsigned int* pb=&b;
       printf("%d,    %u\n",a,b); // a = -2147483476,    b = 2147483820


 

我们从MEMORY看到pa,pb里面存的内容都是:AC 00 00 80,低位在前高位在后,但是因为a,b的数据类型不一样,我们可以看到a,b的值也不一样,a = -2147483476,    b = 2147483820

 

呵呵,总之,>>>和>>是不一样的,至少在J2ME中,另外一定要切记数据类型,同样的东西,数据类型不一样,表示的东西不一样的。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值