【问题标题】:VC++ Unsigned long value changed to negative number what passing to oracle procedureVC++ Unsigned long 值更改为负数,传递给 oracle 程序
【发布时间】:2020-03-16 04:38:38
【问题描述】:

我正在使用 C++ Unsigned Long DWORD 数据类型将大于 2147483647 的数据传递给 oracle 程序。但在过程中插入负数。不知道为什么。

过程参数定义为数字。

在 2003 窗口服务器上运行相同的代码。

但是当在 2012 窗口服务器中使用代码并在 VS2005 32 位模式下构建并部署 dll 时,我遇到了这个问题。

它与 Windows、Oracle 或 C++ 有关吗?

【问题讨论】:

  • 可能是一些 abi 未对齐,您的列数据类型可能已签名。

标签: c++ oracle c++11 unsigned


【解决方案1】:

当传递 32 位参数时,C++ 编译器不关心参数是有符号还是无符号,它只是将 32 位放入堆栈以传递它们。有符号与无符号的问题在于代码中的比较。

听起来您将无符号值传递给期望有符号值的函数。然后将大于 2147483647 的无符号值解释为函数期望的有符号值,这意味着它被解释为负数。如果您调用的函数是 Oracle 过程,那么我怀疑该过程被定义为接受有符号值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多