碰到一个unsigned long的怪问题

frequent 2015-07-08 03:32:36
unsigned char chTest[5]={0x54,0x5a,0xf7,0x14,0x00};
unsigned long nTime=chTest[0]<<24L+chTest[1]<<16L+chTest[2]<<8L+chTest[3];
上面计算出来的nTime竟然为0.

于是我又改成下面这样:
unsigned long nTemp=0;
unsigned char chTest[5]={0x54,0x5a,0xf7,0x14,0x00};
unsigned long nTime=(chTest[0]+nTemp)<<24L+(chTest[1]+nTemp)<<16L+(chTest[2]+nTemp)<<8L+(chTest[3]+nTemp);

算出来的nTime还是为0,请问这是为什么呢?
...全文
210 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sandrer 2015-07-09
  • 打赏
  • 举报
回复
运算符优先级 你的运算符优先级没处理好 +-*/ 的优先级在 << >> 前,所以编译器会先计算 +, 再到 << {0x54,0x5a,0xf7,0x14,0x00} chTest[0]<<24L+chTest[1]<<16L+chTest[2]<<8L+chTest[3] = 84 << 114 << 263 << 28 这结果不溢出就算不错的了
赵4老师 2015-07-09
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
unsigned short int ui;
  signed short int si;
int main() {
    ui=(unsigned short int)0x8000u;
    si=(  signed short int)0x8000;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);
    ui=ui>>1;
    si=si>>1;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);

    printf("--------------\n");
    ui=(unsigned short int)0x8000u;
    si=(  signed short int)0x8000;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);
    ui=((  signed short int)ui)>>1;
    si=((unsigned short int)si)>>1;
    printf("ui=%u\n",ui);
    printf("si=%d\n",si);

    return 0;
}
//ui=32768
//si=-32768
//ui=16384
//si=-16384
//--------------
//ui=32768
//si=-32768
//ui=49152
//si=16384
「已注销」 2015-07-08
  • 打赏
  • 举报
回复
强制转换一下:
BYTE chTest[] = { 0x54, 0x5A, 0xF7, 0x14 };
ULONG nTime = ((ULONG)chTest[0] << 24) | 
              ((ULONG)chTest[1] << 16) | 
              ((ULONG)chTest[2] << 8) | 
              ((ULONG)chTest[3]);
worldy 2015-07-08
  • 打赏
  • 举报
回复
unsigned long nTime=(long)chTest[0]<<24L+(long)chTest[1]<<16L+(long)chTest[2]<<8L+(long)chTest[3]; 最简洁的做法是: unsigned char chTest[5]={0x54,0x5a,0xf7,0x14,0x00}; //0-3单元顺序颠倒一下 unsigned long nTime=*((long*)chTest);
shenyi0106 2015-07-08
  • 打赏
  • 举报
回复

unsigned long nTime     = (xx[0] << 24) + (xx[1] << 16) + (xx[2] << 8) + xx[3];
printf("nTime=%ld\n", nTime);
这样写,结果就对了。 原因是+,-运算符的优先级高于<<,>>运算符
frequent 2015-07-08
  • 打赏
  • 举报
回复
unsigned long n[4]={0x54,0x5a,0xf7,0x14}; unsigned long nTime=n[0]<<24+n[1]<<16+n[2]<<8+n[3]; 这样算出来的nTime竟然也为0.

16,490

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • AIGC Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧