我目前正在尝试使其在数组中保存rgba数据(0x00000000→0xFFFFFFFF)的地方,当我将一个值超过2,147,483,647时,它溢出了,我假设是由于某种可能的转换(可能是无符号的→有符号的)。 / p>
这是我的代码:
int main(int argc, char* args[]) {
uint32_t *background = new uint32_t[1920*1080];
background[100] = 0xFF0000FF; //red, 4278190335
printf("%d, ", background[100]);
return 0;
}
以下是输出:
-16776961
我还是C ++的新手,所以如果我对某些事情忘了,请指出。
答案 0 :(得分:9)
首先,请注意:
uint32_t *background = new uint32_t[1920*1080];
在这里,background
不是数组(在堆栈中),而是在分配内存(包含数组)并保存指向第一个元素的指针。您将需要删除内存。在C ++中,使用std::vector
要容易得多:
// at the top: #include <vector>
std::vector<uint32_t> background(1920*1080);
这将自动解除分配(因此您不必担心)。另一个选择是使用数组,但在这种情况下,最好不要使用数组,因为那里有很多内存(8 MiB),这可能会破坏堆栈。
现在,如果要使用printf
打印unsigned int
,则需要使用%u
(如果需要十六进制,则需要使用%x
):>
printf("%u, ", background[100]); // or...
printf("%x, ", background[100]);
但是,在您的代码中,您使用的是uint32_t
,它是固定类型的。为此,您需要使用:
// at the top: #include <cinttypes>
printf("%" PRIu32 ", ", background[100]); // or...
printf("%" PRIx32 ", ", background[100]);
此外,作为@Someprogrammerdude评论的最后注释,您可以在C ++中使用std::cout
:
// at the top: #include <iostream>
std::cout << background[100] << std::endl; // or...
std::cout << std::hex << background[100] << std::dec << std::endl;
答案 1 :(得分:7)
更改此:
printf("%d, ", background[100]);
对此:
// #include <cinttypes>
printf("%" PRIu32 "", background[100]);
因为您要打印uint32_t
,而不是int
。
PS:由于这是C ++,因此我强烈建议使用std::cout
,它将自动处理这些问题。
PPS:由于您使用过new []
,因此请不要忘记之后再使用delete []
。
答案 2 :(得分:0)
理解数字数据及其输出时的区别很重要。这里没有溢出。数据只是作为有符号值打印。您正在使用十六进制文字正确分配它。您还应该将其打印为十六进制而不是十进制。