2010-11-28 68 views
0

borland如何将无符号整型转换为short?Borland C/C++无符号整型缩写

#include <stdio.h> 

void main() { 
    short sNum = 57000; 
    unsigned short usNum = sNum; 
    unsigned int uiNum; 

    printf("\r\nsNum = %d", sNum); 
    printf("\r\nusNum = %u", usNum); 

    //cast 1: short -> unsigned int 
    uiNum = sNum; 
    printf("\r\nuiNum = %u", uiNum); 

    //cast 2: unsigned short -> unsigned int 
    uiNum = (unsigned short)sNum; 
    printf("\r\nuiNum = %u", uiNum); 
} 

给我的输出:

sNum = -8536 
usNum = 57000 
uiNum = 4294958760 
uiNum = 57000 

为什么我不中投1中得到57000:短unsigned int类型(?有没有隐式转换为无符号短投给无符号整型前)?

回答

0

因为你问到打印带

printf("\r\nsNum = %d", sNum); 

线有符号整数。该变量被符号扩展为int并作为int传递给printf函数,该函数将该参数解释为int。

如果你没有

printf("\r\nsNum = %u", sNum); 

,你会得到57000

+0

好的那一个说法,但问题是,当您使用与其他签署变量变量,则使用的-8536值。 – harry 2010-11-28 12:31:34

+0

不,在第二种情况下,您会得到未定义的行为,将错误的类型传递给`printf`。 (从技术上讲,如果值是正数,我相信你可以传递`int`来代替`unsigned`,因为表达式必须是相同的,但这里是你传递的'int'(sNum的提升值`)是负数)。除非`int`和`short`具有相同的大小,否则我不认为它可以打印57000。 – 2010-11-28 13:22:48

0

你是一个短的范围之外投入的SNUM值。 你得到的存储是整数-8536,其转换为int,然后到一个unsigned int是4294958760.

您需要任何声明SNUM为一个无符号短(所以它可以存储你想要的值),或将其转换为int而不是unsigned int。

1

不,在隐式转换为unsigned int之前没有隐式转换为无符号短整型。为什么会有?

首先,如果在这个实现中短裤是16位,57000不适合,所以你不能在短sNum中存储57000。它会溢出,产生-8536。

在剧组2中,您首先将short(-8536)转换为unsigned short(57000,因为它与-8536的位模式相同,但解释为无符号数),然后从unsigned short到unsigned int(57000)。

在演员1中,您直接从short(-8536)转换为unsigned int。

3

只有一个在你的代码转换:在C语言中

uiNum = (unsigned short)sNum; 

的你调用类型转换剩下的事情由被称为(隐含的)转换。转换中没有隐藏的中间步骤。如果你想要通过一个中间类型,你可以通过强制转换或赋值给这个类型的变量。

其次,该行:

short sNum = 57000; 

具有实现定义的行为。您应该避免将(隐式或通过强制转换)值转换为值不适合的签名类型的代码。

最后,你不应该问这样的关于“C/C++”的问题。没有这样的语言,并且类型系统(即使是纯整数类型)在两种语言中有很大不同,因此根据您实际使用的语言,许多问题都会有不同的答案。

0

短具有8×2 = 16比特

INT已经8×4 = 32位

除非明确地提及作为无符号既int和短签名。 如果是有符号的数字,最左边的位保存符号位。

所以在签名的短小我们剩下16 - 1 = 15位。因此,对于任何大于此值的数字,其上限应为2^15 32768. ,它从2^16(= 65536无符号上限或总容量上限)中扣除,并用负号存储[这是那些恭维]

这里65536 - 57000 = -8536因此,结果