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)
我知道这两种方法都有效,我只是在寻找最好的方法,如果有的话.也许没有,只是使用演员来减少计算是最好的方法?你们有什么感想?
目前尚不清楚是什么类型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 变量选择了正确的名称)。