草庐IT

c++ - 为什么无符号短(乘)无符号短转换为有符号整数?

这个问题在这里已经有了答案:ImplicittypeconversionrulesinC++operators(9个回答)关闭6年前。为什么unsignedshort*unsignedshort在C++11中会转成int?int太小,无法处理这行代码所示的最大值。coutMinGW4.9.2上的溢出-131071因为(source)USHRT_MAX=65535(2^16-1)orgreater*INT_MAX=32767(2^15-1)orgreater*和(2^16-1)*(2^16-1)=~2^32.我应该预料到这个解决方案会出现什么问题吗?unsignedu=static_ca

python - 如何在python中获取long的有符号整数值?

如果lv存储的是long值,并且机器是32位,如下代码:iv=int(lv&0xffffffff)产生一个long类型的iv,而不是机器的int。在这种情况下如何获得(有符号的)int值? 最佳答案 importctypesnumber=lv&0xFFFFFFFFsigned_number=ctypes.c_long(number).value 关于python-如何在python中获取long的有符号整数值?,我们在StackOverflow上找到一个类似的问题:

python - 如何确定一个数字是否是任何类型的 int(核心或 numpy,有符号或无符号)?

我需要测试一个变量是int类型,还是np.int*、np.uint*中的任何一个,最好是使用单个条件(即没有或)。经过一些测试,我猜是:isinstance(n,int)只会匹配int和np.int32(或np.int64取决于平台),np.issubdtype(type(n),int)似乎匹配所有int和np.int*,但不匹配匹配np.uint*。这导致了两个问题:np.issubdtype会匹配any类型的有符号整数吗?可以在一次检查中确定一个数字是任何类型的有符号整数还是无符号整数?这是关于整数的测试,测试应该返回False来表示float-likes。

c++ - 将有符号解释为无符号

我有这样的值(value):int64_ts_val=SOME_SIGNED_VALUE;我怎样才能得到一个uint64_tu_val与s_val具有完全相同的位模式,但被视为无符号?这可能真的很简单,但是在查看Stackoverflow和其他地方之后,我还没有找到答案。 最佳答案 int64_ts_val=SOME_SIGNED_VALUE;uint64_tu_val=static_cast(s_val);C++标准4.7/2规定:Ifthedestinationtypeisunsigned,theresultingvalueis

c++ - 为什么 std::streamsize 被定义为有符号而不是无符号?

根据http://en.cppreference.com/w/cpp/io/streamsizeThetypestd::streamsizeisasignedintegraltypeusedtorepresentthenumberofcharacterstransferredinanI/OoperationorthesizeofanI/Obuffer.据我所知,流的大小永远不会是负数,所以,我的问题是:为什么std::streamsize被定义为signed而不是unsigned?背后的原理是什么? 最佳答案 draftC++sta

c++ - 查找有符号整数和无符号整数是偶数还是奇数

我有一个intm和一个unsignedintj并且想确定它们是偶数还是奇数。过去我一直在使用if((int(j)+m)%2)捕捉只有一个是奇数的情况。但我担心转换为int会错误地改变j的奇偶性。这些都会遇到问题吗?if(!(j%2)!=!(m%2))if(bool(j%2)!=bool(j%2))我知道if(j%2!=m%2)不起作用,因为当m为负数时,'m%2'将产生-1,这将始终评估为trueno不管j%2的值是多少。 最佳答案 不要使用%。这是一个需要位掩码的问题:boolsame_parity=(i&0x1)==(j&0x1

c++ - 是否有一些有意义的统计数据来证明保持有符号整数算术溢出未定义?

C标准明确指定有符号整数溢出具有未定义行为。然而,大多数CPU使用已定义的溢出语义实现有符号算术(除法溢出可能除外:x/0和INT_MIN/-1)。编译器编写者一直在利用这种溢出的未定义性来添加更积极的优化,这些优化往往会以非常微妙的方式破坏遗留代码。例如,此代码可能在较旧的编译器上工作,但在当前版本的gcc和clang上不再适用:/*Incrementabyavaluein0..255,clampatopositiveintegers.Thecoderelieson32-bitwrap-around,buttheCStandardmakessignedintegeroverflowu

c - 是否定义了有符号整数的按位运算结果?

我知道>>在有符号整数上的行为可能取决于实现(特别是当左操作数为负数时)。其他的呢:~,>>,&,^,|?当它们的操作数是内置类型(short、int、long、longlong)的有符号整数时,结果是否保证与它们​​的类型是无符号的一样(就位内容而言)? 最佳答案 对于负操作数,具有未定义的行为和>>的结果是实现定义的(通常作为“算术”右移)。和>>在概念上不是按位运算符。它们是算术运算符,相当于对其定义明确的操作数乘以适当的2次幂。至于真正的位运算符^,~,|,和&,它们对操作数(可能提升的)类型中值的位表示进行操作。他们的结果

c++ - 为什么会发出如此复杂的代码来将有符号整数除以 2 的幂?

当我用VC++10编译这段代码时:DWORDran=rand();returnran/4096;我得到了这个反汇编:299:{300:DWORDran=rand();00403940calldwordptr[__imp__rand(4050C0h)]301:returnran/4096;00403946shreax,0Ch302:}00403949ret简洁明了,用逻辑右移代替了除以2的幂。当我编译这段代码时:intran=rand();returnran/4096;我得到了这个反汇编:299:{300:intran=rand();00403940calldwordptr[__imp_

c++ - 从有符号字符转换为无符号字符然后再转换回来?

我正在使用JNI,并且有一个jbyte类型的数组,其中jbyte表示为有符号字符,即范围从-128到127。jbytes表示图像像素。对于图像处理,我们通常希望像素分量的范围为0到255。因此我想将jbyte值转换为0到255的范围(即与unsignedchar相同的范围),对值进行一些计算,然后存储结果再次为jbyte。如何安全地进行这些转换?我设法让这段代码工作,其中像素值增加了30,但限制为值255,但我不明白它是否安全或可移植:#defineCLAMP255(v)(v>255?255:(v我很想知道如何在C和C++中做到这一点。 最佳答案