gpt4 book ai didi

delphi - 关于将 SmallInt 与 Ord 函数的结果进行比较的警告

转载 作者:行者123 更新时间:2023-12-03 18:15:48 26 4
gpt4 key购买 nike

我正在将 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 函数的提示说它应该返回一个 SmallInt,这就是为什么我不明白是什么导致了警告消息。 (我在 System 单元中寻找过 Ord 函数,但没有找到)。

enter image description here

更多信息:

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

最佳答案

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

文档说,关于 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.

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

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


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

关于delphi - 关于将 SmallInt 与 Ord 函数的结果进行比较的警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44288051/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com