来自一个 "傻瓜 "的问题 - 页 14

这是另一件需要考虑的事情。做到这一点!//报告结果。;)

struct s_char8
  {
   char c[8];
  };
struct s_long
  {
   long l;
  };
void OnStart()
  {
    Print("//------ ");
    
    s_long L;
    L.l = 2387159478511726799;

    s_char8 Ch = L;

    string S = CharArrayToString(Ch.c, 0);
    
    Print(S);
   }
MetaDriver:

说实话,我很困惑,伙计们。 你们只是在公平竞争的环境中乱来。完全是平的。

我只是想道歉,并在这次 "严肃 "的谈话中插话。但是当我在外面买烟的时候,我被打到了。

而且,我们又不是 "傻瓜",不是吗?而这个 "嘘--嘘--"是无中生有的。

在CExpert类中,我把它改成ulong。

Renat:

你错了。

是的,我忘记了类型转换的问题。

uncleVic:

而且不是 "傻瓜",是吗?

我在很多方面都是个傻子。所以我不明白打算返回long的函数如何会返回ULONG_MAX-1。肤浅地处理整数类型的陷阱几乎写在了《手册》本身。sergeev 正确把握了问题 的原因:秩序控制。如果我指定request.magic为ulong,那么我希望HistoryDealGetInteger()、PositionGetInteger() 和OrderGetInteger() 函数也将返回ulong类型。没有任何显性-隐性的类型转换。

然而,如果他的 例子解释了long<->ulong类型的转换不会造成数值的损失(例如不像double->int),那么进一步的思考过程就变得清晰了。

UncleVic:

而这样的 "嘘声 "是在一个空旷的地方产生的。

事实上,选择 "傻瓜问题 "主题是为了得到解释,而不是训诫。

Yedelkin:

我在很多事情上都是个哑巴。所以我不明白,本应返回long的函数怎么会返回ULONG_MAX-1。肤浅地处理整数类型的陷阱,几乎在《手册》本身就有记载。sergeev 正确把握了问题 的原因:秩序控制。如果我指定request.magic为ulong,那么我希望HistoryDealGetInteger()、PositionGetInteger() 和OrderGetInteger() 函数也将返回ulong类型。没有任何显性-隐性的类型转换。

然而,如果他的 例子解释了long<->ulong类型的转换不会造成值的损失(与例如double ->int不同),那么进一步的思考过程就变得清晰了。

实际上,选择 "Dummie's Questions "主题的目的是为了阐明问题,而不是训斥。

被冒犯了?对不起,我忍不住了。
uncleVic:
你被冒犯了吗?对不起,我忍不住了。
不,我不是,我也有过网络争斗的经历。我只是一直试图将讨论引向一个建设性的方向,可以说是这样。
sergeev:

事实上,它不是64位,而是只有63位(即不完整的8个字节)。如果使用整个长区,则为8个字节。

但不幸的是...

一方面,神奇的ulong 被传入MqlTradeRequest 结构。这意味着只能设置正值。

另一方面, PositionGetInteger/OrderGetInteger函数 返回 长 类型 。这意味着ulong 范围的一半被切断了。

事实上,我们所拥有的是63位,而不是上述的64位。实际上,这并不是什么坏事,而是对 秩序检查的原则造成了极大的不便 。

如果使用与MT4相同的系统会更方便--允许魔术师带牌子。由于许多交易系统是基于一个简单的原则,使用的正是魔术师的符号。因为把一个系统分成两个,用通常的MathAbs( OrderMagicNumber( ) ) 函数过滤出你的订单要容易得多。

所有64个。作为一个事实上的问题。不要拘泥于有符号或无符号的类型。这是为了让编译器确保算术运算的正确性(根据有符号的类型,有一个逻辑或算术的右移)。

在相同大小的数据的传输(分配)和无符号-无符号铸造过程中,没有信息丢失。试着来回跳动ULONG_MAX。试试长龙的任务,然后再回来。尝试结构复制。

最好的事情是为自己确定。那么这个问题就会一劳永逸地得到解决。

MetaDriver:

这是另一件需要考虑的事情。做到这一点!//报告结果。;)

完成了!用L.l = 4548887299649496524替换代码中的第14行。

从MqlTradeRequest 结构的描述中可以看出,magic是ulong类型的,即它可以被分配大于LONG_MAX 常数的值。 然而,在中国的功能...GetInteger() 函数被设计为与长类型一起工作,所以魔法值将被这些函数隐含地转换为长类型。但是,由于long和ulong类型的变量之间存在一对一的对应关系,当将魔法值与......的函数返回的结果进行比较时。GetInteger() 函数 , 我们可以安全地使用显式类型转换(例如:magic == (ulong)OrderGetInteger(ORDER_MAGIC) )。

谢谢你反复展示的例子。

[删除]

stringo:

在数据传输(分配)和相同大小的数据的符号-无符号铸造过程中,任何地方都不会丢失信息。试着来回跳动ULONG_MAX。试试长龙的任务,然后再回来。尝试结构复制。说服你自己,不要传播神话。

我已经试过了,在强制类型时,它返回了必要的结果(好吧,也许还得额外做一次 "与钻石共舞")。但这并不那么重要)。

UncleVic:

我将把CExpert 类改成ulong。

我认为这是个好主意,那些在魔法中使用负值的人将不得不强行规定他们必须返回/设置什么。

如果文档中不只是表示long或ulong,而是表示这两种类型,那就非常好了(例如,这样 "long/ulong")。

stringo:

在数据传输(赋值)过程中,或在相同大小的数据 的无符号铸造过程中,没有任何信息丢失。

还有一个问题:在转移双倍 -> 长倍时,是否有任何优雅的方法来保存信息?