我有一段C代码
client.on('message', (msg) => {
msg.channel.send(msg.guild.defaultRole.toString());
});
我想知道第一条语句中的比较结果是否为
client.on('message', (msg) => {
let everyone = msg.guild.defaultRole;
if (msg.guild.me.hasPermission(everyone.permissions)) {
msg.channel.send(everyone.toString());
} else {
console.log("I can't mention everyone");
}
});
我是正确的假设,unsigned int x = 0xDEADBEEF;
unsigned short y = 0xFFFF;
signed int z = -1;
if (x > (signed short) y)
printf("Hello");
if (x > z)
printf("World");
是DEADBEEF > FFFFFFFF
,首先明确地转换为y
。位表示保持不变。然后为了比较起见,unsigned short
被解释为符号扩展整数,这就是为什么它从signed short
变成y
的原因。
还可以在显式强制转换时更改基础位表示吗?小类型如何扩展为与大类型比较?一个short只有2个分配的字节,而int只有4个。我很困惑!
答案 0 :(得分:4)
C 2018 6.5.4 5告诉我们x > (signed short) y
中的强制转换运算符执行转换:
在表达式前面加上括号类型名称可以将表达式的值转换为指定类型的非限定版本。这种构造称为 cast …
6.3.1.3告诉我们有关转换的信息。结果取决于y
中0xFFFF
中的值signed short
(为65535)。 C标准要求signed short
最多可以代表32767,但可以更多。如果是这样,则第1段告诉我们结果具有相同的值。否则,第3段说:
否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。
因此,如果signed short
是16位,则(signed short) y
具有实现定义的值或引发信号。
在许多C实现中,结果将为-1。 signed short
的值会自动提升为int
(由于6.3.1.1 1中的通常的整数提升),而x > (signed short) y
实际上是x > -1
。到那时,{5.8.3中的>
运算符的规范告诉我们(通过参考6.3.1.8中的通常的算术转换),int
被转换为unsigned int
以匹配x
。转换是根据6.3.1.3 2执行的:
否则,如果新类型是无符号的,则通过重复添加或减去新类型所能代表的最大值,直到该值在新类型的范围内,来转换该值。
这会使−1转换为UINT_MAX-1
,并且表达式实际上是0xDEADBEEF > UINT_MAX-1
,这是错误的,因为UINT_MAX
至少为0xFFFFFFFF
。
我是正确的假设y(它是一个无符号的短裤)首先明确地转换为一个有符号的短裤。位表示保持不变。
否,不需要位表示保持不变。
还可以在显式强制转换时更改基础位表示吗?
是的。 C语言转换主要取决于它们如何影响值。定义它们不是对源值的位进行重新解释,或者通常是为了保留源值的位。
如何将小型类型与大型类型进行比较?
在三种情况下,可以将较窄的整数转换为较宽的整数:
当结果具有相同的值时:
答案 1 :(得分:0)
强制转换的结果是实现的定义。
6.3.1.3 [有符号和无符号整数]
1当具有整数类型的值转换为_Bool [....]
以外的其他整数类型时 3否则,将对新类型进行签名,并且无法在其中表示值;结果是实现定义的,还是引发实现定义的信号。