C 不强制转换从有符号整数转换为无符号整数

C 不强制转换从有符号整数转换为无符号整数,c,C,我正在编写一个函数,它接受32位,如果x在本例中不需要,则返回1。如果你摆脱了这个角色,右移将保留符号位 假设int为32位,删除强制转换将导致负数为-1,非负数为0。虽然非负情况下的实际返回值不同,但在布尔上下文中,它将按预期工作。在这种情况下,您不需要这样做。如果你摆脱了这个角色,右移将保留符号位 假设int为32位,删除强制转换将导致负数为-1,非负数为0。虽然非负情况下的实际返回值不同,但在布尔上下文中,它将按预期工作。您的问题是编写一个函数,该函数采用32位,如果x

我正在编写一个函数,它接受32位,如果x在本例中不需要,则返回1。如果你摆脱了这个角色,右移将保留符号位


假设
int
为32位,删除强制转换将导致负数为-1,非负数为0。虽然非负情况下的实际返回值不同,但在布尔上下文中,它将按预期工作。

在这种情况下,您不需要这样做。如果你摆脱了这个角色,右移将保留符号位


假设
int
为32位,删除强制转换将导致负数为-1,非负数为0。虽然非负情况下的实际返回值不同,但在布尔上下文中,它将按预期工作。

您的问题是编写一个函数,该函数采用32位,如果
x<0
0,则返回
1

int isNegative(int x) {
  return ((unsigned) x)>> 31;
}
int为负(int x){
返回x<0;
}

无论
int
的大小如何,这都将起作用,并且不会调用任何类型转换。我想您已经考虑过这个问题了。

您的问题是编写一个函数,该函数接受32位,如果
x<0

int isNegative(int x) {
  return ((unsigned) x)>> 31;
}
int为负(int x){
返回x<0;
}

无论
int
的大小如何,这都将起作用,并且不会调用任何类型转换。我想你已经考虑过这个问题了。

OP有不同的隐含问题

一个函数,如果x>将这两种风险实现定义的行为组合在一起,则该函数取32位并返回1,除非给出令人信服的理由,否则应避免使用该函数

示例实现定义行为的一个示例是有符号整数右移时高阶位的传播。C11§3.4.2 2


OP有不同的隐含问题

一个函数,如果x>将这两种风险实现定义的行为组合在一起,则该函数取32位并返回1,除非给出令人信服的理由,否则应避免使用该函数

示例实现定义行为的一个示例是有符号整数右移时高阶位的传播。C11§3.4.2 2


执行自动类型转换的操作有多种,其中包括赋值、特定条件下的算术运算和函数调用(特定参数值的转换)

因此,只需将(
signed
int
参数声明为参数类型,即可将(
signed
)参数转换为
unsigned int

 int i;
 unsigned u = i;
不过,不可否认,该函数接口可能有点混乱。因此,您可能更愿意这样做:

int isNegative(unsigned x) {
  return x >> 31;
}
然而,我认为这两个版本都不如你的原始版本清晰,因为它的演员阵容。类型转换是转换的全部目的,当转换是您所需要的(以及您所需要的全部)时,转换就是工作的正确工具


当然,总的来说,我更喜欢@chux建议的更简单的方法系列。

有各种各样的操作可以执行自动类型转换,其中包括赋值、特定条件下的算术运算和函数调用(特定参数值的转换)

因此,只需将(
signed
int
参数声明为参数类型,即可将(
signed
)参数转换为
unsigned int

 int i;
 unsigned u = i;
不过,不可否认,该函数接口可能有点混乱。因此,您可能更愿意这样做:

int isNegative(unsigned x) {
  return x >> 31;
}
然而,我认为这两个版本都不如你的原始版本清晰,因为它的演员阵容。类型转换是转换的全部目的,当转换是您所需要的(以及您所需要的全部)时,转换就是工作的正确工具


当然,总体而言,我更喜欢@chux建议的更简单的方法系列。

不清楚为什么代码不是简单的
返回x<0
,因为这满足了更高级别的目标“如果您希望函数采用32位数据类型,则返回1,即“长”“不是int。为什么你需要不施法就转换?这就是施法的目的。@chux:这将避免任何
int
width!=32根据您的平台,您的函数不需要32位,而是16位和
INF
位之间的任何值。如果您想要32位,请使用固定宽度类型。不清楚为什么代码不是简单地返回x<0,因为这满足了更高级别的目标“如果xi您想要您的函数采用32位数据类型,则返回1”,这是一个“长”“不是int。为什么你需要不施法就转换?这就是施法的目的。@chux:这将避免任何
int
width!=32根据您的平台,您的函数不需要32位,而是16位和
INF
位之间的任何值。如果您想要32位,请使用固定宽度类型。详细信息:“结果-1表示负数,0表示非负数”是非常常见的但实现定义的行为。答案是限制性的,但DV过多。详细信息:“结果-1表示负数,0表示非负数”是非常常见但实现定义的行为。答案是限制性的,但DV是过度的。