【问题标题】:unsigned short vs unsigned int - sometimes they are the same range? [closed]unsigned short 与 unsigned int - 有时它们是相同的范围? [关闭]
【发布时间】:2013-03-05 14:25:12
【问题描述】:

unsigned shortunsigned int 有什么区别?我发现unsigned short0-65,535unsigned int0-65,5350-4,294,967,295。我不太了解其中的区别。如何知道架构中数据类型的大小?如果例如 c = (unsigned short) d;cunsigned short 并且 d 是 unsigned int ;那什么意识? d 的前 16 位分配给 c?

【问题讨论】:

  • 为什么会提到三种语言?
  • 听起来像 C,去掉了无关的语言标签。
  • 对 3 种语言不通用?
  • @Lafore - 不,不是真的。 Java 有不同的东西。

标签: c types int short


【解决方案1】:

您实际上是在问shortint 之间的区别。答案是short 可能更窄,但也可能与int 宽度相同。这几乎就是我们所知道的一切,与平台无关。很多平台都有 32 位 int 和 16 位 short,但不是全部。

【讨论】:

  • 谢谢。你能检查我的第二部分编辑吗? :)
  • 不,我不会,请只问另一个问题,而不是在已经回答的问题上添加更多位。如果您搜索您的新查询,您可能会发现它们已经是带有答案的问题。
  • 好的。无论如何,谢谢。
【解决方案2】:

这是一个解释 C 数据类型历史的有用链接:

http://en.wikipedia.org/wiki/C_data_types

因此,您的数据类型的大小取决于平台,但如果您的 int 长度为 32 位,那么它将能够表示 2^32 个不同数字之一(如果无符号,则为 0 - 4,294,967,295)。同样,如果您的 short 长度为 16 位,则它可以表示 2^16 个不同数字之一(如果无符号,则为 0 - 65,535)。

此链接为您提供 Visual Studio 2005 的实现细节,其中 int 的大小为 32 位(4 个字节),short 的大小为 16 位(2 个字节):

http://msdn.microsoft.com/en-us/library/s3f49ktz(v=vs.80).aspx

您的具体实现将取决于您的编译器。

至于您问题的最后一部分,是的,如果您尝试将大于 short 最大值的 int 转换为 short,那么您最终会得到一个不同的值(可能是前 16 位,但您应该测试确定)。

【讨论】:

  • 谢谢。你能检查我的第二部分编辑吗? :)
  • 我已经看到了链接。 TY
【解决方案3】:

我们不能说变量类型名称(short、int、long、double 等)必须指向所有微处理器架构或编程语言中的特定位长度。它主要取决于微处理器的体系结构,当然还有编程语言的定义。一般来说,有符号/无符号短应该(我希望)有符号/无符号整数的一半位大小。

【讨论】:

  • No... 在 C 中 shortint 很可能都是 16 位。顺便说一句,在 DOS 上就是这种情况。
【解决方案4】:

首先你必须了解什么是 unsigned int 和 short。

一切都被分解成碎片。

short 是 16 位,每个位是 1 或 0。为简单起见,我将使用 4 位进行演示

1000 - Unsigned = 8 
1000 - Signed = -8 
1111 - Unsigned = 15 which is equal to 2^(# of bits) -1
1111 - Signed = -1

注意,对于无符号数,数字的范围更大,我们可以使 1111 = 15。

但是对于带符号的数字,最大的可能性是 0111 = 7.

现在短片有 16 位,给它

signed range of  −32,768 to 32,767  [−(2^15) to 2^15 − 1]
Unsigned range: 0 to 65,53  = 2^16 -1

一个 Int 有 32 位,给出一个范围

Signed:−2,147,483,648 to 2,147,483,647 = −(2^31) to 2^31 − 1
Unsigned:  0 to 4,294,967,295 = 2^16 -1

【讨论】:

  • 谢谢。我知道,只是模棱两可,因为它们具有相同的值范围。
  • @Lafore 啊。当你做一个 short 时,它不能保证 16 位,而 16 位 Int 可以。因此,它适用于您绝对需要 16 位整数的情况。有点奇怪。
  • 大错特错...char 至少为 8 位,shortint 16,long 32 位。在 CRAY 上,它们是 all 32 位。
  • 嗯? @vonbrand int 是 32 位,因此范围是 2^31-1
  • @BrettD int 的大小和范围是实现定义的。标准要求范围(对于short)至少为-3276732767,因此int 必须至少为16 位宽。对于unsignedintshort),范围必须至少为065535,因此也必须至少为16 位宽。此外,标准要求(unsigned) short 的范围包含在(unsigned) int 的范围内,(unsigned) char 的范围必须包含在(unsigned) short 的范围内。所有这些类型都具有相同的宽度是完全合法的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-03
  • 2021-12-13
  • 1970-01-01
相关资源
最近更新 更多