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进行隐式转换?)?
答案 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因此结果