【问题标题】:comparison between unsigned int and unsigned charunsigned int 和 unsigned char 之间的比较
【发布时间】:2013-06-15 11:01:37
【问题描述】:

我有一个无符号字符数组,例如Data[2]。我需要它与返回 unsigned int 的函数的输出进行比较。

我尝试将 Data[2] 转换为 unsigned int ,反之亦然。没用。

我想做的是:

if (Data[2] == ReadFlash2(40))
{
    //Do Something.
}

ReadFlash2 是一个返回 unsigned int 的函数,而Data[2] 是一个 unsigned char。

我尝试对它们中的每一个进行投射,但没有成功。

我做错了什么吗?我应该施放哪一个,我应该施放什么?

谢谢。

编辑: Readflash函数的代码:

unsigned int ReadFlash2(unsigned int Addr) // use as Read Function 
{
pMem = (unsigned int*)MEM_STR_ADR; 
pMem += Addr; 
Nop(); 
return(*pMem); 
}

【问题讨论】:

  • 您遇到了什么错误?
  • @AlexandruBarbarosie,if 比较是错误的,这意味着它没有通过。
  • Data[2]的值和ReadFlash2(40)的值是多少?
  • @Liban 你确定数字相等吗?
  • Data 的定义是什么样的?只是一个疯狂的猜测,但是您是否正在使用 16 位 MCU 并尝试将整个两个元素数组(不仅仅是单个元素)与 int 进行比较?

标签: c type-conversion unsigned-integer unsigned-char mplab


【解决方案1】:

您根本不需要强制转换它们,C 中与隐式提升相关的规则应该会为您解决这个问题。

换句话说,将unsigned charunsigned int 进行比较将首先将unsigned char 提升为兼容,然后进行比较。

C99 6.3.1.8 Usual arithmetic conversions 中涵盖了所有内容(在讨论浮点类型之后):

否则,对两个操作数都执行整数提升。

然后将以下规则应用于提升的操作数:

如果两个操作数的类型相同,则不需要进一步转换。

否则,如果两个操作数都具有有符号整数类型或都具有无符号 整数类型,具有较小整数转换等级类型的操作数是 转换为具有更高等级的操作数的类型。

...等等,但上面的最后一段是适用的。

如果类型如您所述并且Data[2] 实际上与从ReadFlash2(40) 返回的值相同的值,那么它不是 C 环境,至少不符合标准。

【讨论】:

  • @Liban,好吧,要么是C,要么不是C。如果是C,它会遵守规则。如果它遵守规则,则应重新标记为close to C but not quite :-)
  • 那么您是否建议将unsigned char 提升为unsigned int
  • 不,我建议它不应该是必要的,只要你有一个真正的 C 环境。您可以尝试显式提升 char,这可能会奏效,但您超出了我的专业知识范围,因为我对不符合标准的 C 类环境知之甚少 :-)
【解决方案2】:

您似乎正在访问微控制器上的易失性内存,这可能会在调试时造成一些混乱。尝试在比较之前将Data[2]ReadFlash(40) 存储到变量中:

unsigned char data_2 = Data[2];
unsigned int readflash2_40 = ReadFlash2(40);

if (data_2 == readflash2_40)
{
    //Do Something.
}

现在您应该能够通过查看变量中的值来检查正在比较的实际值。

【讨论】:

  • 我也这么认为.. 我也这样做了,但还是没用。为了检查值是否相同,我将它们都发送到主机并且它是相同的。
  • 沃恩,奇怪的是:当我直接访问ReadFlash2(40) 时,它是1,但是当我存储到变量中时,它是00
  • @Liban:可能值会发生变化。也许当您第一次调用 ReadFlash2(40) 将其发送到主机时,它是一个值,而当您下次调用它进行比较时,它是一个不同的值。
  • 你是对的,值正在改变。程序流程有问题。我将两者都投给了unsigned long。有效。谢谢老兄。
猜你喜欢
  • 2011-07-02
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
  • 2017-06-20
  • 1970-01-01
  • 2012-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多