【问题标题】:Warning on comparing a SmallInt with result of Ord function将 SmallInt 与 Ord 函数的结果进行比较时发出警告
【发布时间】:2017-05-31 14:54:35
【问题描述】:

我将SmallInt 变量与Ord 函数的结果进行比较。 示例:

var
  MySmallInt : SmallInt;
begin
  MySmallInt := 5;
  if(MySmallInt > Ord('C'))
  then ShowMessage('True')
  else ShowMessage('False');
end

执行此操作后,将显示以下警告消息 (W1023):

W1023 比较有符号和无符号类型 - 扩大了两个操作数

Delphi 对Ord 函数的提示说它应该返回SmallInt,这就是为什么我无法理解导致警告消息的原因。 (我在System 单元中寻找了Ord 函数,但没有找到)。

更多信息:

  • 我正在 Delphi XE7 下进行测试。
  • 在 Delphi 2007 下,相同的代码不会给我任何警告。

【问题讨论】:

    标签: delphi compiler-warnings delphi-xe7


    【解决方案1】:

    正如大卫所说,Ord() 是一个所谓的“编译器魔法”(或者,他们现在称之为“内在”或“伪”)函数,即不是一个真正被调用的函数,而只是一些东西它使用函数语法,但被编译器识别为特殊构造并直接转换为代码。这同样适用于例如Chr()Writeln() 等。它们通常可以有不同和/或多种类型的参数或返回值,有时甚至还有额外的语法元素。

    文档说,关于Ord(X)

    结果是X的序数位置;它的类型是最小的标准整数类型,可以保存 X 类型的所有值。

    在 Delphi XE7 中,'C'WideCharOrd('C') 的返回值将是 16 位 无符号 类型 (Word)。 Smallintsigned 类型。这就是您收到警告的原因,因为您正在比较大小相同的有符号和无符号类型,因此必须将值扩大到下一个更大的类型 (Integer)

    在 Delphi 2007 中,'C' 不是WideChar,而是AnsiChar,所以Ord('C') 的结果是Byte。没有必要扩大到下一个更大的类型,因为Smallint 可以包含Byte 的所有值,所以两者都可以提升为Smallint


    我同意编辑器中的信息提示具有欺骗性。 Ord() 并不总是返回 Smallint,它返回保存参数所有值所需的最小类型。

    【讨论】:

      【解决方案2】:

      Ord() 是一个产生无符号类型的内在函数。因此发出警告。在你的情况下,你传递给它一个WideChar,所以匹配的整数类型是Word

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-05
        • 2012-10-14
        • 1970-01-01
        • 1970-01-01
        • 2018-01-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多