【问题标题】:What is the difference between “int” and “uint” / “long” and “ulong”?“int”和“uint”/“long”和“ulong”有什么区别?
【发布时间】:2011-04-13 01:27:22
【问题描述】:

我知道intlong(32 位和64 位数字),但uintulong 是什么?

【问题讨论】:

    标签: c# types integer unsigned signed


    【解决方案1】:

    uintulongintlong 的未签名版本。这意味着它们不能是负面的。相反,它们具有更大的最大值。

    类型 Min Max CLS 兼容 整数 -2,147,483,648 2,147,483,647 是 uint 0 4,294,967,295 否 多头 –9,223,372,036,854,775,808 9,223,372,036,854,775,807 是 乌龙 0 18,446,744,073,709,551,615 否

    要在源代码中编写文字 unsigned int,您可以使用后缀 uU,例如 123U

    如果您希望成为CLS-Compliant,则不应在公共界面中使用 uint 和 ulong。

    阅读文档了解更多信息:

    顺便说一句,还有shortushortbytesbyte

    【讨论】:

    • 这很有趣 - 你对 CLS 兼容是什么意思?该链接转到 int 的 MSDN 文档。如果“CLS”是指 C# 语言规范,那么我不明白 - 规范清楚地描述了 uint 和 ulong(第 1.3 节)
    • @Isak Savo:如果您编写的接口可以被 C# 以外的其他 .NET 语言使用,那么符合 CLS 就很重要。
    • 好奇你提到了 short 和 ushort 但忽略了 byte 和 sbyte :)
    【解决方案2】:

    以“u”为前缀的原始数据类型是具有相同位大小的无符号版本。实际上,这意味着它们不能存储负数,但另一方面,它们可以存储的正数是有符号数的两倍。签名的副本没有“u”前缀。

    int(32 位)的限制是:

    int: –2147483648 to 2147483647 
    uint: 0 to 4294967295 
    

    而对于长(64 位):

    long: -9223372036854775808 to 9223372036854775807
    ulong: 0 to 18446744073709551615
    

    【讨论】:

    • 这很有趣。 32 位有符号变量使用 1 位作为符号(正或负),因此可以存储 -2^31 和 +2^31 - 1 之间的值
    • 比较int和uint的用法,哪一个可行?
    • 什么是 c++ 等价物?
    • @JacoPretorius 错了。 8 位 int 的范围从 –128 到 127。第 9 位表示 256。因此,使用 8 位您可以表示高达 255(第 9 个 val - 1)的所有值。从 -128 到 127 的范围的长度正好是 255。所以没有一个位可以持有该符号。高达 127 的所有值都是正数。上面的值显示为负数。 255 将是-1。 254 将是 -2,因此下降到 128。
    • 我觉得还值得注意的是,专门针对 int vs uint,无符号整数不符合 CLS,建议尽可能多地使用 int。
    【解决方案3】:

    区别在于uintulong是无符号数据类型,意味着范围不同:它们不接受负值:

    int range: -2,147,483,648 to 2,147,483,647
    uint range: 0 to 4,294,967,295
    
    long range: –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
    ulong range: 0 to 18,446,744,073,709,551,615
    

    【讨论】:

      【解决方案4】:

      u 表示unsigned,所以ulong 是一个没有符号的大数。您可以在ulong 中存储比long 更大的值,但不允许使用负数。

      long 值以 64 位存储,其第一个数字表示它是正数还是负数。而ulong 也是 64 位的,全部 64 位来存储数字。所以ulong的最大值是2(64)-1,而long是2(63)-1。

      【讨论】:

        【解决方案5】:

        自从我使用 C++ 以来已经有一段时间了,但这些答案有点不对劲。

        就大小而言,'int' 什么都不是。它是标准整数的名义值;出于迭代之类的目的,假设它很快。它没有预设大小。

        因此,关于 int 和 uint 之间差异的答案是正确的,但当他们谈论“它们有多大”或它们的范围是什么时,它们是不正确的。这个大小是未定义的,或者更准确地说,它会随着编译器和平台而改变。

        在公共场合讨论你的比特大小是不礼貌的。

        当你编译一个程序时,int 确实有一个大小,因为你已经把抽象的 C/C++ 变成了具体的机器代码。

        所以,今天,实际上对于大多数常见的编译器来说,它们是正确的。但不要假设这一点。

        具体来说:如果你正在编写一个 32 位的程序,int 将是一回事,64 位可以不同,而 16 位则不同。我已经浏览了所有三个并简要查看了 6502 颤抖

        一个简短的谷歌搜索显示: https://www.tutorialspoint.com/cprogramming/c_data_types.htm 这也是很好的信息: https://docs.oracle.com/cd/E19620-01/805-3024/lp64-1/index.html

        如果您真的不在乎您的位有多大,请使用 int;它可以改变。

        如果您想知道某物有多大,请使用 size_t 和 ssize_t。

        如果您正在读取或写入二进制数据,请不要使用 int。使用(通常取决于平台/源)特定关键字。 WinSDK 有很多很好的、可维护的例子。其他平台也可以。

        我花了很多时间研究那些“SMH”的人的代码,认为这只是学术/迂腐。这些吃掉了编写不可维护代码的人。当然,使用 'int' 类型很容易,并且无需额外的输入即可使用它。要弄清楚它们的真正含义需要做很多工作,而且有点让人麻木。

        当你混合 int 时,这是糟糕的编码。

        当您只需要一个快速整数并且不关心范围(有符号/无符号除外)时,请使用 int 和 uint。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-14
          • 1970-01-01
          • 2022-01-21
          • 2023-01-03
          • 2011-08-06
          • 1970-01-01
          相关资源
          最近更新 更多