【问题标题】:converting grayscale 8-bit to 32-bit将灰度 8 位转换为 32 位
【发布时间】:2021-12-16 05:36:03
【问题描述】:

我有以下代码

char c = 0xEE;
int color = 0xFF000000;
color += (int)c;
printf("%x\n", color);    

我预计结果是 0xFF0000EE;但输出却是

-> feffffee

我错过了什么,我以为只是计算

(int)(0xFF << 24 + c << 16 + c << 8 + c);

会给 0xFFEEEEEE 但我得到 0

编辑:

以下代码似乎有效:

unsigned char c = 0xEE;
unsigned int color = 0xFF000000; /* full opacity */

color += (unsigned int)c;
color += (unsigned int)c << 8;
color += (unsigned int)c << 16;    
printf("-> %x\n", color); 

    

【问题讨论】:

  • 使用unsigned类型
  • 请注意换档顺序的优先顺序。 + 的优先级高于 &lt;&lt;
  • 感谢您的回答

标签: c gcc colors


【解决方案1】:

char 可以是有符号类型或无符号类型。对你来说,它显然是一个有符号的类型。你最终分配了-18,当在 2 的补码机器上扩展到 32 位时,它是 ffffffee。

固定:

#include <stdio.h>

int main(void) {
   unsigned char c = 0xEE;
   unsigned int color = 0xFF000000;
   color |= c;
   printf("%x\n", color);   
   return 0;
}

便携:

#include <inttypes.h>
#include <stdint.h>
#include <stdio.h>

int main(void) {
   unsigned char c = 0xEE;
   uint32_t color = 0xFF000000;
   color |= c;
   printf("%" PRIx32 "\n", color);   
   return 0;
}

【讨论】:

    【解决方案2】:

    以下修改也会导致0xFF0000EE:

    unsigned int c = 0x000000EE;
    unsigned int color = 0xFF000000;
    color =  c | color;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 2013-01-06
      • 1970-01-01
      • 2020-05-07
      相关资源
      最近更新 更多