对于想了解为什么从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)
- c – 为什么auto_ptr的dynamic_cast会失败?
- c – 为什么double转换为int转换不起作用?
- c – 为什么调用大尺寸的mmap()不会失败?
- c# – 为什么我可以安全地转换为int而不是转换为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会失败?
#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
解决方法
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转换不起作用?
#include <iostream>int main(){ double x = 4.10; double j = x * 100; int k = (int) j; std::cout << k; } Output: 409
我似乎无法用任何其他数字复制此行为.也就是说,用该表单中的任何其他数字替换4.10,输出正确.
必须有一些低级转换的东西我不明白.
谢谢!
解决方法
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()不会失败?
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.谁能跟我说点什么呢?
解决方法
mprotect只是改变了保留存储器的读/写访问权限;它也不会使它驻留在RAM中.通过传递PROT_READ |可以获得相同的效果PROT_WRITE而不是PROT_NONE到mmap,并删除对mprotect的调用.
如果您需要将内存直接驻留在RAM中,那么请使用mlock.如果没有足够的RAM,它将失败.在许多Linux平台(包括Ubuntu)上,有一个资源限制(RLIMIT_MEmlock),它限制了任何进程可以锁定的内存量;你可以用ulimit -l来调整它.
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; }
…错误输出“对象未设置为对象的引用”?
解决方法
cb.Tag可能是一个字符串,而不是一个int,一个不能直接转换为另一个. Convert.ToInt32()实际上解析字符串并使用转换后的值创建一个新的int.
强制转换仅尝试将类型的实例解释为另一种类型的实例.
今天的关于为什么从short转换为int会失败?和short转成int的分享已经结束,谢谢您的关注,如果想了解更多关于c – 为什么auto_ptr的dynamic_cast会失败?、c – 为什么double转换为int转换不起作用?、c – 为什么调用大尺寸的mmap()不会失败?、c# – 为什么我可以安全地转换为int而不是转换为int?的相关知识,请在本站进行查询。
本文标签: