【问题标题】:Is it safe to compare an (uint32_t) with an hard-coded value?将 (uint32_t) 与硬编码值进行比较是否安全?
【发布时间】:2013-06-29 19:35:17
【问题描述】:

我需要对 32 位整数进行逐位运算(确实是 represent chars,但无论如何)。

下面的代码安全吗?

uint32_t input;
input = ...;

if(input & 0x03000000) {
    output  = 0x40000000;
    output |= (input & 0xFC000000) >> 2;

我的意思是,在“if”语句中,我正在对左侧的 uint32_t 和右侧进行按位运算...我不知道!

那么你知道硬编码“0x03000000”的类型和大小(我的意思是存储了多少字节)吗?

是否有可能某些系统将 0x03000000 视为 int 并因此仅在 2 个字节上对其进行编码,这将是灾难性的?

【问题讨论】:

  • 我觉得很好。
  • 右边被提升为它适合的最小整数类型(或int,如果它比int短),所以比较是安全的。
  • 1.您可以随时将其转换为您需要的内容:(uint32_t)0x03000000。 2. 为了清晰和重复使用,您应该制作这些#define。您也可以添加演员表:#define MYBITS (uint32_t)0x03000000.

标签: c uint32-t


【解决方案1】:

下面的代码安全吗?

是的。

那么你知道硬编码“0x03000000”的类型和大小(我的意思是存储了多少字节)吗?

0x03000000 在具有32-bit int 的系统上是int,在具有16-bit int 的系统上是long

(由于uint32_t 出现在这里,我假设8 的二进制补码和CHAR_BIT。另外我不知道任何带有16-bit int64-bit long 的系统。)

是否有可能某些系统将 0x03000000 视为 int 并因此仅在 2 个字节上对其进行编码,这将是灾难性的?

16-bitint 系统上见上文,0x03000000long32-bit。 C 中的十六进制常量是第一种可以表示的类型: int, unsigned int, long, unsigned long, long long, unsigned long long

【讨论】:

  • 好的,但是如果我用 0x00000001 代替呢?在 16 位系统上,它将表示为 16 位整数。然后我将在 32 位 uint32_t 和 16 位 0x00000001 之间进行逐位运算。这会引发错误还是可以?
  • 0x00000001 保证为int。在带有uint32_t 的按位表达式中,常量将被提升为uint32_t,所以没问题。
  • @ouah:我认为在int 为64 位宽的平台上,双方都将转换为int
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-05
  • 1970-01-01
  • 2012-04-24
  • 2018-10-25
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多