无符号短整型和无符号整型有时候具有相同的范围吗?

14
unsigned shortunsigned int 有什么区别?我发现 unsigned short0-65,535,而 unsigned int0-65,535 或者 0-4,294,967,295。我不太理解它们之间的区别。如何知道数据类型在我的架构中的大小?例如,当 c 是一个 unsigned short,而 d 是一个 unsigned int 时,c = (unsigned short) d; 是什么意思?是将 d 的前16位赋值给 c 吗?

为什么提到了三种语言? - Lion
听起来像C语言,去掉多余的语言标签。 - djechlin
这不是适用于三种语言的通用情况吗? - mpluse
4
@Lafore - 不完全是这样。Java有一个不同的东西。 - Lion
4个回答

6
你真正想问的是shortint之间有什么区别。答案是short可能更窄,但也可能与int相同宽度。这几乎是我们所知道的唯一确定的,在不同平台上都是如此。许多平台具有32位的int和16位的short,但并非所有平台都是如此。

1
谢谢。您能检查一下我第二部分的编辑吗? :) - mpluse
1
不,我不会这样做,请提出另一个问题,而不是在已经回答的问题上添加更多内容。如果您搜索您的新问题,您可能会发现它们已经是在这里有答案的问题。 - John Zwinck

2

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

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

因此,数据类型的大小取决于平台,但如果您的int长度为32位,则它将能够表示2^32个不同的数字(如果无符号则为0-4294967295)。类似地,如果您的short长度为16位,则可以表示2^16个不同的数字(如果无符号则为0-65535)。

此链接提供了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位,但应进行测试以确保)。


谢谢。你能检查一下我第二部分的编辑吗? :) - mpluse
我已经看到了链接。谢谢。 - mpluse

0
我们无法说变量类型名称(short、int、long、double等)在所有微处理器体系结构或编程语言中都必须指定特定的位长度。它大多取决于微处理器的体系结构和当然是编程语言的定义。通常,有符号/无符号 short 应该有(我期望)有符号/无符号 int 的一半的位大小。

1
在C语言中,shortint都可以是16位。顺便说一下,在DOS上就是这种情况。 - vonbrand

-1
首先,您必须了解无符号整数和短整型是什么。
一切都可以分解成位。
一个短整型是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。
现在一个short类型有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^311
Unsigned:  0 to 4,294,967,295 = 2^16 -1

谢谢。我知道,只是因为它们具有相同的值范围而产生了歧义。 - mpluse
@Lafore 啊。当你创建一个short时,它并不能保证是16位,而16位的Int可以。所以这是在你绝对需要一个16位整数的情况下使用的。有点奇怪。 - BrettD
1
非常错误...一个char至少有8位,一个shortint有16位,一个long有32位。而在CRAY上,它们都是32位。 - vonbrand
嗯?@vonbrand,一个int是32位,所以范围是2^31-1。 - BrettD
1
@BrettD int 的大小和范围是由实现定义的。标准规定其范围(与 short 相同)至少为 -3276732767,因此 int 必须至少有 16 位宽度。对于 unsigned (intshort),范围必须至少为 065535,因此也必须至少有 16 位宽度。此外,标准规定 (unsigned) short 的范围包含在 (unsigned) int 的范围内,而 (unsigned) char 的范围必须包含在 (unsigned) short 的范围内。这些类型具有相同的宽度是完全合法的。 - Daniel Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接