gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:53:09 33 4
gpt4 key购买 nike

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

是否做了以下就足够了:

chunk_lsb = (uint8)variable;
chunk_msb = (uint8)(variable >> 8);

还是我应该戴口罩:

chunk_lsb = (uint8)(variable & 0xFFu);
chunk_msb = (uint8)((variable >> 8) & 0xFFu);

我知道这两种方法都有效,我只是在寻找最好的方法(如果有的话)。也许没有,只是使用强制转换来减少计算是最好的方法?大家怎么看?

最佳答案

不清楚是什么类型variable是。没有具体说明,我们只能推测。

但一般来说,您应该避免对有符号整数类型进行位移,因为这会导致各种形式的定义不明确的行为。这反过来意味着您也必须小心小整数类型,因为它们会被提升为有符号 int。 .参见 Implicit type promotion rules .

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

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

因此无论左移还是右移,最安全、最便携的方式是这样的:

chunk_lsb = variable;
chunk_msb = ((unsigned int)variable >> 8);

尽管您可能希望过于明确以消除所有编译器警告:

chunk_lsb = (uint8_t) (variable & 0xFFu);
chunk_msb = (uint8_t) ( (unsigned int)variable>>8 & 0xFFu );

关于c - 是否应该使用强制转换来截断长变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54866461/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com