在C中十六进制级别拆分int?

在C中十六进制级别拆分int?,c,binary,int,hex,C,Binary,Int,Hex,我试图从图像缓冲区中提取一些颜色代码。当我从缓冲区读取内存adres时,它返回一个int值,该值包含两个像素的颜色代码。我的目标是将每个颜色代码作为一个单独的int值 例如,当我从图像缓冲区读取内存adres时,它返回十进制值:142149753 因为这个十进制值有9个字符长,所以我不能简单地将它转换成两个int值。因此,我尝试使用printf函数将值转换为十六进制,该函数给了我值:08790879‬. 现在我可以看到我需要的两个16位颜色代码:0879和0879 int firstColorC

我试图从图像缓冲区中提取一些颜色代码。当我从缓冲区读取内存adres时,它返回一个int值,该值包含两个像素的颜色代码。我的目标是将每个颜色代码作为一个单独的int值

例如,当我从图像缓冲区读取内存adres时,它返回十进制值:142149753

因为这个十进制值有9个字符长,所以我不能简单地将它转换成两个int值。因此,我尝试使用printf函数将值转换为十六进制,该函数给了我值:08790879‬.

现在我可以看到我需要的两个16位颜色代码:0879和0879

int firstColorCode;
int secondColorCode;

int colorcodes = IORD_ALTERA_AVALON_PIO_DATA(0x08000000 + 123204);

printf("%08x\n", colorcodes);
如何将这两个颜色代码转换为代码中相应的int变量


免责声明:我是C新手,感觉我在问一个愚蠢的问题:/

您需要使用右移来获取第一个颜色代码。对于第二个颜色代码,您需要使用
uint16\u t

firstColorCode = (uint16_t) (colorcodes >> 16u);
secondColorCode = (uint16_t) colorcodes;
你也可以用

firstColorCode = (colorcodes >> 16u) & 0xFFFFu;
secondColorCode = colorcodes & 0xFFFFu;
您应该为颜色代码使用无符号的int值,以避免在右移中出现未定义的行为

uint16_t firstColorCode;
uint16_t secondColorCode;
uint32_t colorcodes; 

此外,根据@lundin的建议,我在常量中添加了
u
,使其成为无符号常量。

在C型系统雷区行走时有一些基本规则:

  • 在执行任何形式的按位操作时,切勿使用有符号类型
  • 当你实际上不想要负数时,千万不要使用有符号的类型
  • 使用小整数类型时要小心,例如
    char
    short
    uint16\u t
    等,因为它们在表达式中使用时会隐式升级为带符号的
    int

    有关隐性促销的更多信息:
  • 要小心十六进制文字,因为它们有各种微妙的规则来确定它们的类型。始终使用
    u
    作为后缀,以防止它们成为有符号类型
  • 永远不要在C代码中写前导零。如果用C编写类似于
    0879
    的代码,则表示八进制格式
通过更加注意类型,我们可以将您的32位数字一分为二,如下所示:

#include <stdint.h>

uint16_t first;
uint16_t second;

uint32_t colorcodes = IORD_ALTERA_AVALON_PIO_DATA(0x8000000u + 123204u);

first = (uint16_t) (colorcodes >> 16);
second = (uint16_t) colorcodes;
#包括
uint16_t优先;
uint16秒;
uint32\u t colorcodes=IORD\u ALTERA\u AVALON\u PIO\u数据(0x800000U+123204u);
第一个=(uint16_t)(颜色代码>>16);
second=(uint16_t)颜色代码;

使用
printf(“%”PRIx16,第一个)
,从
inttypes.h

uint16\u t
打印为十六进制,只需将数字除以
65536
。剩下的部分是你那一半的下半部分,商是最有意义的部分


顺便说一句,关于使用无符号值的一些评论也是很好的,并考虑右移位< <代码>未签名int >代码>编号>代码>16 <代码>等价于除以代码> 2 ^ 16=65536</代码> .< /p>您将如何用铅笔和一张纸手工完成此操作?<代码> 2147483647 <代码>适合于<代码> int <代码>(32位),也有9位数字。你在问什么?你的代码中不应该有任何签名类型。这是不稳定的,并且容易出现错误,代码正在移动一个
int
类型,该类型可能设置了符号位,但我们不需要任何符号。在移位之前,必须将
colorcodes
强制转换为
unsigned int
。还要养成在所有十六进制文字上使用
u
后缀的习惯。