GVKun编程网logo

为什么从short转换为int会失败?(short转成int)

12

对于想了解为什么从short转换为int会失败?的读者,本文将提供新的信息,我们将详细介绍short转成int,并且为您提供关于c–为什么auto_ptr的dynamic_cast会失败?、c–为什么

对于想了解为什么从short转换为int会失败?的读者,本文将提供新的信息,我们将详细介绍short转成int,并且为您提供关于c – 为什么auto_ptr的dynamic_cast会失败?、c – 为什么double转换为int转换不起作用?、c – 为什么调用大尺寸的mmap()不会失败?、c# – 为什么我可以安全地转换为int而不是转换为int?的有价值信息。

本文目录一览:

为什么从short转换为int会失败?(short转成int)

为什么从short转换为int会失败?(short转成int)

我们有一些代码将数据从Microsoft Access数据库存档到MS SQL
Server数据库中。假设我们已经从Access表中填充了一个数据读取器,并且正在为SqlCommand添加一个参数以准备插入,那么我们有一个类型转换失败了。这是代码:

oSqlServerDbCmd_ForInsert.Parameters.AddWithValue("@Duration",(int) oReader["Duration"]);

oReader中的字段实际上是一个Access
Integer,在C#中是简称。如果我们在这里做空,那没有问题。但是,如果将其强制转换为int,则代码将引发InvalidCastException。我可能会误读MSDN文档中的内容:

“存在从short到int,long,float,double或decimal的预定义隐式转换。”

…但是听起来这应该可行(我的推理是,如果定义了隐式转换,为什么显式类型转换不起作用?)。我意识到强制转换甚至是没有必要的,因为AddWithValue接受一个对象,因此我们实际上已经从代码中删除了强制转换,但是我很乐意看到一个解释,说明这种强制转换失败的原因,以防万一我们遇到这样的情况。未来。

c – 为什么auto_ptr的dynamic_cast会失败?

c – 为什么auto_ptr的dynamic_cast会失败?

#include "iostream"

    class A {
        private:
        int a;
        public :

        A(): a(-1) {}
        int getA() {
            return a;
        }

    };

    class A;

    class B : public A {
        private:
        int b;
        public:

        B() : b(-1) {}

        int getB() {
            return b;
        }

    };

    int main() {
        std::auto_ptr<A> a = new A();

        std::auto_ptr<B> b = dynamic_cast<std::auto_ptr<B> > (a);

        return 0;

    }

错误:不能dynamic_cast`(& a) – > std :: auto_ptr< _Tp> :: get()const

解决方法

那么,std :: auto_ptr< B>不是从std :: auto_ptr< A>派生的.但是B来自A. auto_ptr不知道那个(它不是那么聪明).看起来您想使用共享所有权指针. boost :: shared_ptr是理想的,它还提供了dynamic_pointer_cast:
boost::shared_ptr<A> a = new A();
boost::shared_ptr<B> b = dynamic_pointer_cast<B> (a);

对于auto_ptr,这样的事情无法真正起作用.因为所有权将转移到b.但如果演员表失败,b就无法获得所有权.目前还不清楚该怎么办.您可能不得不说,如果演员表失败,将继续拥有所有权 – 这听起来会导致严重的麻烦.最好开始使用shared_ptr.然后a和b都指向相同的对象 – 但是B作为shared_ptr< B>和a作为shared_ptr< A>

c – 为什么double转换为int转换不起作用?

c – 为什么double转换为int转换不起作用?

我一直在寻找一个正确的解释为什么这是发生,但仍然不太明白,所以我道歉,如果这是一个转贴.
#include <iostream>int main(){    double x = 4.10;    double j = x * 100;    int k = (int) j;    std::cout << k; } Output: 409

我似乎无法用任何其他数字复制此行为.也就是说,用该表单中的任何其他数字替换4.10,输出正确.

必须有一些低级转换的东西我不明白.

谢谢!

解决方法

4.1不能用双精确表示,它被近似于稍微小一些的东西:
double x = 4.10;printf("%.16f\n",x);  // displays 4.0999999999999996

所以j将会比410稍微小一点(即409.99 …).铸造到int丢弃小数部分,所以你得到409.

(如果你想要另外一个类似行为的数字,可以尝试8.2或16.4或32.8 …看到模式?)

义务链接:What Every Computer Scientist Should Know About Floating-Point Arithmetic.

c – 为什么调用大尺寸的mmap()不会失败?

c – 为什么调用大尺寸的mmap()不会失败?

我尝试使用mmap()来操作虚拟内存.我想保留并提交一个内存区域.我测试了这段代码:
const unsigned long gygabyte = 1024 * 1024 * 1024;const unsigned long gygabyteCount = 2;const unsigned long maxCapacity = gygabyteCount * gygabyte;int main(){    char* pMemory;    pMemory = (char*)mmap(NULL,maxCapacity,PROT_NONE,MAP_PRIVATE | MAP_ANONYMOUS,-1,0);    if ( mprotect(pMemory,PROT_READ | PROT_WRITE) != 0 )    {        cout << "Memory Allocation has Failed" << endl;    }    usleep(-1);    return 0;}

我从一个终端运行了我的程序的几个副本(比如说6个).我没有看到任何一个“内存分配失败”.我正在运行64位Ubuntu,内存为4GB.谁能跟我说点什么呢?

解决方法

mmap保留进程虚拟地址空间的一个区域,但不会立即为其分配物理RAM.因此,在64位平台上,您可以保留大量而不会失败(尽管您仍需要检查失败;您的示例代码没有). RAM的物理页面稍后在访问存储器时分配.

mprotect只是改变了保留存储器的读/写访问权限;它也不会使它驻留在RAM中.通过传递PROT_READ |可以获得相同的效果PROT_WRITE而不是PROT_NONE到mmap,并删除对mprotect的调用.

如果您需要将内存直接驻留在RAM中,那么请使用mlock.如果没有足够的RAM,它将失败.在许多Linux平台(包括Ubuntu)上,有一个资源限制(RLIMIT_MEmlock),它限制了任何进程可以锁定的内存量;你可以用ulimit -l来调整它.

c# – 为什么我可以安全地转换为int而不是转换为int?

c# – 为什么我可以安全地转换为int而不是转换为int?

为什么这样做:

ComboBox cb = sender as ComboBox;
int validSelection = Convert.ToInt32(cb.Tag);
if (cb.Selectedindex != validSelection) {
    cb.Selectedindex = validSelection;
}

…但是这个:

ComboBox cb = sender as ComboBox;
int validSelection = (int)cb.Tag; // <-- fails
if (cb.Selectedindex != validSelection) {
    cb.Selectedindex = validSelection;
}

…错误输出“对象未设置为对象的引用”?

解决方法

那是因为 a conversion is not the same thing as a cast.

cb.Tag可能是一个字符串,而不是一个int,一个不能直接转换为另一个. Convert.ToInt32()实际上解析字符串并使用转换后的值创建一个新的int.

强制转换仅尝试将类型的实例解释为另一种类型的实例.

今天的关于为什么从short转换为int会失败?short转成int的分享已经结束,谢谢您的关注,如果想了解更多关于c – 为什么auto_ptr的dynamic_cast会失败?、c – 为什么double转换为int转换不起作用?、c – 为什么调用大尺寸的mmap()不会失败?、c# – 为什么我可以安全地转换为int而不是转换为int?的相关知识,请在本站进行查询。

本文标签: