“int”和“uint”/“long”和“ulong”有什么区别?

问题描述 投票:0回答:6

我知道

int
long
(32 位和 64 位数字),但是
uint
ulong
是什么?

c# types integer unsigned signed
6个回答
303
投票

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

int(32 位)的限制是:

int: –2147483648 to 2147483647 
uint: 0 to 4294967295 

长时间(64 位):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615

47
投票

uint
ulong
int
long
的无符号版本。这意味着它们不能是消极的。相反,它们具有更大的最大值。

类型 最小值 最大值 符合 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,您可以使用后缀

u
U
,例如
123U

如果您希望CLS 兼容,则不应在公共接口中使用 uint 和 ulong。

阅读文档以获取更多信息:

顺便说一句,还有 shortushort 以及 bytesbyte


13
投票

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

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


12
投票

区别在于

uint
ulong
是无符号数据类型,意味着范围不同:它们不接受负值:

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

0
投票

根据这里的其他答案和一点回顾,您可以这样理解:无符号是指负数或正数显式赋值的赋值(想想-1中的“-”)以及无法拥有负数版本说数字。

由于负端的容量被作为一种选择移除,因此他们将该容量分配给正端,因此正估值的最大值加倍。因此,比特范围不是沿着正估值和负估值分割,而是将 ushort、uint、along 等分配给估值的正端。


0
投票

自从我使用 C++ 以来已经有一段时间了,但是这些答案对于 C# 来说有点偏离。我不记得我最初回答时是否没有 c# 标签,或者我是否只是没有注意到标签。如果你错过了一个标签,上帝会帮助你,尽管问题很散文或搜索引擎如何找到你。

再次强调,对于 C/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。

© www.soinside.com 2019 - 2024. All rights reserved.