草庐IT

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

coder 2024-02-22 原文

C++ 标准是否要求 非负 标准有符号整数类型的范围至少与负范围一样大?

编辑:请注意,我指的是 非负 范围在这里,而不是 范围显然比 小一非负 范围。

编辑:如果我们假设 C++11,答案是"is"。请参阅下面的说明。从 C++03 的角度来看,答案很可能是否定的。

同样的问题可以提出如下:标准是否保证a - b的结果?可以用标准的有符号整数类型表示 T假设两者 ab T 类型的值,还有 a ≥ b ?

我知道该标准允许负值的二进制补码、一个补码和符号幅度表示(参见 C++11 第 3.9.1 节 [basic.fundamental] 第 7 段),但我不确定它是否需要使用这三种表示之一。可能不是。

如果我们假设这三种表示中的一种,并且假设对两个范围(负和非负)中的任何一个都没有“虚假”限制,那么非负范围确实至少为大为负。事实上,对于二进制补码,两个范围的大小将相等,而对于其他两种表示,非负范围的大小将比负范围的大小大 1。

然而,即使我们假设上述表示之一,也确实不足以保证任何一个范围的大小。

我在这里寻求的是明确提供所需保证的一个部分(或一组部分)。

任何帮助将不胜感激。

请注意,类似以下内容就足够了:整数的“存储槽”中的每一位都有一个,并且只有以下功能之一:

  • 未使用
  • 符号位(独占或混合符号/值位)
  • 值位(参与值)

  • 我有一个模糊的内存,C99 说了一些类似的话。任何对此有所了解的人?

    好的,C99(带有 TC3)确实在第 6.2.6.2 节“整数类型”第 2 段中提供了必要的保证:

    For signed integer types, the bits of the object representation shall be divided into three groups: value bits, padding bits, and the sign bit. There need not be any padding bits; there shall be exactly one sign bit. Each bit that is a value bit shall have the same value as the same bit in the object representation of the corresponding unsigned type (if there are M value bits in the signed type and N in the unsigned type, then M ≤ N ). If the sign bit is zero, it shall not affect the resulting value. If the sign bit is one, the value shall be modified in one of the following ways:

    • the corresponding value with sign bit 0 is negated (sign and magnitude);
    • the sign bit has the value −(2N ) (two’s complement);
    • the sign bit has the value −(2N − 1) (ones’ complement ).

    Which of these applies is implementation-defined, as is whether the value with sign bit 1 and all value bits zero (for the first two), or with sign bit and all value bits 1 (for ones’ complement), is a trap representation or a normal value. In the case of sign and magnitude and ones’ complement, if this representation is a normal value it is called a negative zero.



    有人可以确认C99的这部分也是C++ 11的绑定(bind)部分吗?

    我再次仔细查看了 C99 和 C++11 标准,很明显,C99 第 6.2.6.2 节第 2 段中的保证在 C++11 中也具有约束力。

    C89/C90 不提供相同的保证,因此我们确实需要 C99,这意味着我们确实需要 C++11。

    总之,C++11(和C99)提供了以下保证:
  • 基本有符号整数类型(标准 + 扩展)中的负值 必须可以使用以下三种表示法之一来表示:二的补码、一的补码或符号幅度。
  • 的尺寸非负 范围是 大于或等于所有基本有符号整数类型(标准 + 扩展)的负范围的大小。

  • 第二个保证可以重述如下:
    -1 ≤ min<T> + max<T> ≤ 0
    

    对于任何基本的有符号整数类型 T (标准 + 扩展)其中 min<T>max<T>std::numeric_limits<T>::min() 的简写和 std::numeric_limits<T>::max()分别。

    另外,如果我们假设 ab是相同或不同的基本有符号整数类型(标准或扩展)的值,则 a - bdecltype(a - b) 中定义明确且可表示只要ab要么都是负的,要么都是非负的。

    最佳答案

    尽管我可能遗漏了关键段落,但该标准似乎并未强制要求这样做。我们所知道的基本有符号整数类型都在 3.9.1/2 中:

    There are five standard signed integer types : “signed char”, “short int”, “int”, “long int”, and “long long int”. In this list, each type provides at least as much storage as those preceding it in the list.



    在 3.9.1/7 中:

    Types bool, char, char16_t, char32_t, wchar_t, and the signed and unsigned integer types are collectively called integral types.48 A synonym for integral type is integer type. The representations of integral types shall define values by use of a pure binary numeration system.



    这些段落似乎都没有说明各自的正负范围。即使考虑到我无法想象无法满足您需求的二进制表示。

    关于c++ - 有符号 C++ 整数的非负范围是否至少与负范围一样大?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22204257/

    有关c++ - 有符号 C++ 整数的非负范围是否至少与负范围一样大?的更多相关文章

    1. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

      给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

    2. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

      我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

    3. ruby - 检查数组是否在增加 - 2

      这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

    4. ruby - 触发器 ruby​​ 中 3 点范围运算符和 2 点范围运算符的区别 - 2

      请帮助我理解范围运算符...和..之间的区别,作为Ruby中使用的“触发器”。这是PragmaticProgrammersguidetoRuby中的一个示例:a=(11..20).collect{|i|(i%4==0)..(i%3==0)?i:nil}返回:[nil,12,nil,nil,nil,16,17,18,nil,20]还有:a=(11..20).collect{|i|(i%4==0)...(i%3==0)?i:nil}返回:[nil,12,13,14,15,16,17,18,nil,20] 最佳答案 触发器(又名f/f)是

    5. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

      我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

    6. ruby-on-rails - 相关表上的范围为 "WHERE ... LIKE" - 2

      我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que

    7. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

      我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

    8. ruby - 检查日期是否在过去 7 天内 - 2

      我的日期格式如下:"%d-%m-%Y"(例如,今天的日期为07-09-2015),我想看看是不是在过去的七天内。谁能推荐一种方法? 最佳答案 你可以这样做:require"date"Date.today-7 关于ruby-检查日期是否在过去7天内,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/32438063/

    9. ruby - 当使用::指定模块时,为什么 Ruby 不在更高范围内查找类? - 2

      我刚刚被困在这个问题上一段时间了。以这个基地为例:moduleTopclassTestendmoduleFooendend稍后,我可以通过这样做在Foo中定义扩展Test的类:moduleTopmoduleFooclassSomeTest但是,如果我尝试通过使用::指定模块来最小化缩进:moduleTop::FooclassFailure这失败了:NameError:uninitializedconstantTop::Foo::Test这是一个错误,还是仅仅是Ruby解析变量名的方式的逻辑结果? 最佳答案 Isthisabug,or

    10. ruby - 如何验证 IO.copy_stream 是否成功 - 2

      这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

    随机推荐