簡體   English   中英

將灰度 8 位轉換為 32 位

[英]converting grayscale 8-bit to 32-bit

我有以下代碼

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); 

    

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;
}

以下修改也將導致 0xFF0000EE:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM