【发布时间】:2020-07-16 19:56:02
【问题描述】:
我正在阅读一本实现自己动手 DNS 消息阅读器的书,它会尝试查看特定字段是否设置为 true。 书中使用的一段代码我看不懂。
const int qdcount = (msg[10] << 8) + msg[11];
msg 是 ==> char 类型(即 8 位)
qdcount ==> 应该是一个 16 位的字段,包含 DNS 查询的数量(由两个字段组成,msg[10] 和 msg[11])
那么这段代码是如何工作的(例如,如果 msg[10] = 01001 0001)将其左移 8 应该会导致(1000 0000)即 UB,那么所做的任何计算都会导致错误的答案。假设msg[11] = 0010 1111。计算结果是 1000 0000 + 0010 1111 对吗?那么这行代码是如何工作的呢。
【问题讨论】:
-
请不要描述
msg的类型,而是显示声明。 -
在移位完成之前,操作数被转换为
int,因此10010001被转换为00000000 00000000 00000000 10010001(或11111111 11111111 11111111 10010001),然后才执行左移位 -
参见Bitwise_shift_operators:“对两个操作数执行积分提升。”
-
@pmg 我不明白如果促销是自动完成的,这个操作什么时候会导致 UB。
-
你机器中的普通
char是有符号类型还是无符号类型?很重要
标签: c dns undefined-behavior bit-shift