Borland C / C ++强制转换为unsigned int

时间:2010-11-28 11:43:27

标签: c casting borland-c++

borland如何向unsigned int投短?

#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之前是否没有对unsigned short进行隐式转换?)?

5 个答案:

答案 0 :(得分:3)

您的代码中只有一个演员:

uiNum = (unsigned short)sNum;

你正在调用的其他东西被称为C语言中的(隐式)转换。转化中没有隐藏的中间步骤。如果您想要通过中间类型,可以通过强制转换或赋值将其强制转换为该类型的变量。

其次,行:

short sNum = 57000;

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

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

答案 1 :(得分:1)

不,在转换为unsigned int之前,没有对unsigned short进行隐式转换。为什么会这样?

首先,如果此实现中的短路为16位,则57000不适合,因此您无法在短sNum中存储57000。它会溢出,产生-8536。

在强制转换2中,您首先将(使用显式强制转换)从short(-8536)转换为无符号short(57000,因为这是与-8536相同的位模式,但解释为无符号数),然后从unsigned short to unsigned int(57000)。

在强制转换1中,您可以直接从short(-8536)转换为unsigned int。

答案 2 :(得分:0)

因为您要求使用

打印带符号的整数
 printf("\r\nsNum = %d", sNum);

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

如果你做了

printf("\r\nsNum = %u", sNum);
你会得到57000

答案 3 :(得分:0)

你在sNum中输入一个短期范围之外的值。 你得到的是整数-8536,转换为int然后转换为unsigned int是4294958760.

您需要将sNum声明为unsigned short(因此它可以存储您想要的值)或将其转换为int而不是unsigned int。

答案 4 :(得分:0)

short有8 * 2 = 16位

int有8 * 4 = 32位

除非明确提及无符号,否则将签署int和short。 如果是带符号的数字,则最左边的位保持符号位。

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

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