关于将 SmallInt 与 Ord 函数的结果进行比较的警告
Warning on comparing a SmallInt with result of Ord function
我正在将 SmallInt
变量与 Ord
函数的结果进行比较。
示例:
var
MySmallInt : SmallInt;
begin
MySmallInt := 5;
if(MySmallInt > Ord('C'))
then ShowMessage('True')
else ShowMessage('False');
end
执行此操作后,将显示以下警告消息 (W1023):
W1023 Comparing signed and unsigned types - widened both operands
Delphi 对 Ord
函数的提示说它应该 return a SmallInt
这就是为什么我不明白是什么导致了警告消息。 (我在 System
单元中寻找 Ord
函数,但没有找到)。
更多信息:
- 我正在 Delphi XE7 下进行测试。
- 在 Delphi 2007 下,相同的代码没有给我任何警告。
Ord()
是产生无符号类型的内部函数。因此警告。在你的例子中,你传递给它一个 WideChar
,所以匹配的整数类型是 Word
.
正如 David 所说,Ord()
是所谓的 "compiler magic"(或者,正如他们现在所说的那样,"intrinsic" 或 "pseudo-")函数,即不是真正的函数被调用的函数,但只是使用函数语法的东西,但被编译器识别为特殊结构并直接转换为代码。例如,同样如此。 Chr()
、Writeln()
等。它们通常可以有不同的and/or多种类型的参数或return值,有时甚至有额外的语法元素。
文档说,关于 Ord(X)
:
The result is the ordinal position of X; its type is the smallest standard integer type that can hold all values of X's type.
在DelphiXE7中,'C'
是一个WideChar
,Ord('C')
的return值将是一个16位无符号 类型 (Word
)。 Smallint
是 signed 类型。这就是您收到警告的原因,因为您正在比较相同大小的有符号和无符号类型,因此必须将值扩大到下一个更大的类型 (Integer
).
在Delphi 2007中,'C'
不是WideChar
,而是AnsiChar
,所以Ord('C')
的结果是Byte
.不需要扩大到下一个更大的类型,因为 Smallint
可以包含 Byte
的所有值,所以两者都可以提升为 Smallint
.
我同意编辑器中的信息提示具有欺骗性。 Ord()
并不总是 return 和 Smallint
,它 return 是保存所有参数值所需的最小类型。
我正在将 SmallInt
变量与 Ord
函数的结果进行比较。
示例:
var
MySmallInt : SmallInt;
begin
MySmallInt := 5;
if(MySmallInt > Ord('C'))
then ShowMessage('True')
else ShowMessage('False');
end
执行此操作后,将显示以下警告消息 (W1023):
W1023 Comparing signed and unsigned types - widened both operands
Delphi 对 Ord
函数的提示说它应该 return a SmallInt
这就是为什么我不明白是什么导致了警告消息。 (我在 System
单元中寻找 Ord
函数,但没有找到)。
更多信息:
- 我正在 Delphi XE7 下进行测试。
- 在 Delphi 2007 下,相同的代码没有给我任何警告。
Ord()
是产生无符号类型的内部函数。因此警告。在你的例子中,你传递给它一个 WideChar
,所以匹配的整数类型是 Word
.
正如 David 所说,Ord()
是所谓的 "compiler magic"(或者,正如他们现在所说的那样,"intrinsic" 或 "pseudo-")函数,即不是真正的函数被调用的函数,但只是使用函数语法的东西,但被编译器识别为特殊结构并直接转换为代码。例如,同样如此。 Chr()
、Writeln()
等。它们通常可以有不同的and/or多种类型的参数或return值,有时甚至有额外的语法元素。
文档说,关于 Ord(X)
:
The result is the ordinal position of X; its type is the smallest standard integer type that can hold all values of X's type.
在DelphiXE7中,'C'
是一个WideChar
,Ord('C')
的return值将是一个16位无符号 类型 (Word
)。 Smallint
是 signed 类型。这就是您收到警告的原因,因为您正在比较相同大小的有符号和无符号类型,因此必须将值扩大到下一个更大的类型 (Integer
).
在Delphi 2007中,'C'
不是WideChar
,而是AnsiChar
,所以Ord('C')
的结果是Byte
.不需要扩大到下一个更大的类型,因为 Smallint
可以包含 Byte
的所有值,所以两者都可以提升为 Smallint
.
我同意编辑器中的信息提示具有欺骗性。 Ord()
并不总是 return 和 Smallint
,它 return 是保存所有参数值所需的最小类型。