jjzjj

c++ - 有符号 C++ 整数的非负范围是否至少与负范围一样大?

C++标准是否要求非负标准有符号整数类型的范围至少与负范围一样大?编辑:请注意,我指的是非负范围在这里,而不是正范围显然比小一非负范围。编辑:如果我们假设C++11,答案是"is"。请参阅下面的说明。从C++03的角度来看,答案很可能是否定的。同样的问题可以提出如下:标准是否保证a-b的结果?可以用标准的有符号整数类型表示T假设两者a和b是负T类型的值,还有a≥b?我知道该标准允许负值的二进制补码、一个补码和符号幅度表示(参见C++11第3.9.1节[basic.fundamental]第7段),但我不确定它是否需要使用这三种表示之一。可能不是。如果我们假设这三种表示中的一种,并且假设

c++ - 使用 a<32> 将 bitset<a> 转换为 signed int

我正在阅读问题convertbitsettointinc++然后想,嘿,那行不通,我已经试过了。但后来我开始尝试并很快发现:#include#includeintmain(){std::bitsetb31(-1);std::bitsetb32(-1);std::cout(b31.to_ulong())(b32.to_ulong())给出输出2147483647-1那么,如何将小于32的位集转换为有符号整数?澄清:我想使用在构造保留的位集时使用的10基值转换回signedint。“将带符号的整数存储在位集中”我已经在win7上用gcc4.6.2和mingw32试过了,用c风格的转换(in

c++ - boost::lexical_cast<signed char> 无法处理负数?

这个简短的C++程序的行为方式让我感到困惑:#include#include#include#includeintmain(void){signedcharc=-2;assert(c==-2);c=boost::lexical_cast(std::string("-2"));std::cout使用g++5.2.1和boost-1.58.0,我得到:terminatecalledafterthrowinganinstanceof'boost::exception_detail::clone_impl>'what():badlexicalcast:sourcetypevaluecouldn

c++ - C++ 中的有符号类型表示

在我正在阅读的书中说:Thestandarddoesnotdefinehowsignedtypesarerepresented,butdoesspecifythatrangeshouldbeevenlydividedbetweenpositiveandnegativevalues.Hence,an8-bitsignedcharisguaranteedtobeabletoholdvaluesfrom-127through127;mostmodernmachinesuserepresentationsthatallowvaluesfrom-128through127.我假设[-128;12

c++ - gcc 4.6 编译器的奇怪行为

这段代码:templateclassInt_Core{static_assert(Check_Range::check(Min,std::numeric_limits::min()),"INCORRECTMinrange.");static_assert(Check_Range::check(Max,std::numeric_limits::max()),"INCORRECTMaxrange.");}我得到的错误是在第二个static_assert上告诉我使用了非常量表达式。但是如果我在第二个断言中将“Max”更改为“Min”,它确实可以毫无问题地编译。怎么回事?错误:错误:静态断言的

c++ - 将 unsigned long long 与 signed long long 结果相减?

假设我有这两种类型:typedefunsignedlonglonguint64;typedefsignedlonglongsint64;我有这些变量:uint64a=...;uint64b=...;sint64c;我想从a中减去b并将结果赋给c,很明显,如果差值的绝对值大于2^63,那么它将换行(或未定义),这是可以的。但是对于绝对差小于2^63的情况,我希望结果是正确的。以下三种方式:c=a-b;//signconversionwarningignoredc=sint64(a-b);c=sint64(a)-sint64(b);其中哪些可以保证按标准工作?(以及为什么/如何?)

c++ - int8_t 和 char : converts between pointers to integer types with different sign - but it doesn't

我正在处理一些嵌入式代码,并且正在从头开始编写一些新东西,因此我更愿意坚持使用uint8_t、int8_t等类型。然而,当移植一个函数时:voidfunctionName(char*data)到:voidfunctionName(int8_t*data)在将文字字符串传递给函数时,我收到编译器警告“在指向具有不同符号的整数类型的指针之间转换”。(即调用functionName("putthistextin");时)。现在,我明白了为什么会发生这种情况,并且这些行只是调试,但我想知道人们认为什么是最合适的处理方式,而不是对每个文字字符串进行类型转换。在实践中,我不认为一揽子类型转换比使用

c++ - char c = 255 的值转换为 int

我的问题是关于Stroustrup的《C++编程语言》第4版一书中的一段话。他举了一个例子charc=255;//255is‘‘allones,’’hexadecimal0xFFinti=c;以及如何在char有符号或无符号的机器上转换它的解释。i的值是多少?不幸的是,答案是不确定的。在8位字节的实现中,答案取决于扩展为int时“全部”char位模式的含义。在char没有符号的机器上,答案是255。在char有符号的机器上,答案是−1。我的问题是为什么它会是-1,这不是取决于机器上使用的二进制数表示形式吗?如果它使用一个补码,它不是0(-0)吗?如果使用二进制补码,它不是-1吗?

c++ - 什么时候右移操作>>移位符号位,什么时候不移位?

我的问题是为什么a>>1移动符号位,而不是(a&0xaaaaaaaa)>>1?代码片段inta=0xaaaaaaaa;std::cout>1)>1);std::cout>1)>1);结果410101010101010101010101010101010411010101010101010101010101010101410101010101010101010101010101010401010101010101010101010101010101 最佳答案 a>>1很无聊。它只是为负a的signed类型定义的实现。(a&0xaaaa

c++ - unsigned-signed 下溢机制

我知道以下内容unsignedshortb=-5u;由于下溢,评估为b为65531,但我不明白5u在转换为-5之前是否转换为带符号的int,然后重新转换回无符号以存储在b中,或者-5u是等于0-5u(不应该这样,-x是一元运算符) 最佳答案 5u是一个文字无符号整数,-5u是它的否定。无符号整数的否定定义为从2**n中减去,得到相同的结果包装从零减去的结果。 关于c++-unsigned-signed下溢机制,我们在StackOverflow上找到一个类似的问题: