是否应该使用强制转换来截断长变量?

Soy*_*ete 9 c casting truncate mask

我有一个16位无符号变量.我需要将它分成8位块.

正在做以下事情:

chunk_lsb = (uint8)variable;
chunk_msb = (uint8)(variable >> 8);
Run Code Online (Sandbox Code Playgroud)

或者我应该使用面具:

chunk_lsb = (uint8)(variable & 0xFFu);
chunk_msb = (uint8)((variable >> 8) & 0xFFu);
Run Code Online (Sandbox Code Playgroud)

我知道这两种方法都有效,我只是在寻找最好的方法,如果有的话.也许没有,只是使用演员来减少计算是最好的方法?你们有什么感想?

Lun*_*din 7

目前尚不清楚是什么类型variable.如果没有指定,我们只能推测.

但一般来说,你应该避免在有符号整数类型上进行位移,因为这会导致各种形式的定义不明确的行为.这反过来意味着您必须小心使用小整数类型,因为它们会被提升为签名int.请参阅隐式类型提升规则.

(uint8)((variable >> 8) & 0xFFu);如果variable是未签名的,则具体情况是安全的.否则它是不安全的,因为右移负值会导致实现定义的行为(算术或逻辑移位).

variable << 8将调用16位系统上的未定义行为,如果variable是小整数类型,或者是int16_t.

因此,无论左/右移动,最安全,最便携的方式是:

chunk_lsb = variable;
chunk_msb = ((unsigned int)variable >> 8);
Run Code Online (Sandbox Code Playgroud)

虽然您可能希望过于明确,以便使所有编译器警告静音:

chunk_lsb = (uint8_t) (variable & 0xFFu);
chunk_msb = (uint8_t) ( (unsigned int)variable>>8 & 0xFFu );
Run Code Online (Sandbox Code Playgroud)


Jos*_*ose -1

也许没有,只是使用强制转换来减少计算是最好的方法?

一般来说,asm 代码是相同的,因此就速度而言,使用哪一个并不重要:

你们有什么感想?

IMO,第一个在可读性方面更清晰,但我无法找出支持我的偏好的编码标准或指南。无论如何,如果您的偏好是第二个,我会使用一个const变量,以删除幻数并更清楚地表明目的是屏蔽(假设您为 const 变量选择了正确的名称)。

  • *无论如何,如果您的偏好是第二个,我会使用“const”变量,以删除幻数并更清楚地表明目的是掩码*任何认为位掩码上下文中的“0xFF”是“幻数”的人必须用一个变量来掩盖的是参与货物崇拜编程。还有什么可能的变量比“0xFF”作为位掩码更清晰?`one_byte_bit_mask_0xFF`? (3认同)