我正在尝试使用数组保存rgba数据(0x00000000→0xFFFFFFFF),当我将值超过2,147,483,647溢出时,我假设因为某些可能的转换(可能是无符号→已签名).
这是我的代码:
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;
}
Run Code Online (Sandbox Code Playgroud)
这是输出:
-16776961
Run Code Online (Sandbox Code Playgroud)
我仍然对C++有些新意,所以如果我忘记某些事情,请指出它.
首先,快速说明:
Run Code Online (Sandbox Code Playgroud)uint32_t *background = new uint32_t[1920*1080];
这里,background不是数组(在堆栈中),而是分配内存(包含数组)并保存指向第一个元素的指针.您需要删除内存.在C++中,使用a更容易std::vector:
// at the top: #include <vector>
std::vector<uint32_t> background(1920*1080);
Run Code Online (Sandbox Code Playgroud)
哪个会自动解除分配(所以你不必担心它).另一个选择是使用一个数组,但在这种情况下,你最好不要,因为它有相当多的内存(8 MiB),这可能会破坏你的堆栈.
现在,如果你想用来printf打印unsigned int,你需要使用%u(或者%x如果你想用十六进制):
printf("%u, ", background[100]); // or...
printf("%x, ", background[100]);
Run Code Online (Sandbox Code Playgroud)
但是,在您使用的代码中uint32_t,这是一种固定类型.为此,您需要使用:
// at the top: #include <cinttypes>
printf("%" PRIu32 ", ", background[100]); // or...
printf("%" PRIx32 ", ", background[100]);
Run Code Online (Sandbox Code Playgroud)
另外,最后一个注释为@Someprogrammerdude评论,您可以std::cout在C++中使用:
// at the top: #include <iostream>
std::cout << background[100] << std::endl; // or...
std::cout << std::hex << background[100] << std::dec << std::endl;
Run Code Online (Sandbox Code Playgroud)
改变这个:
printf("%d, ", background[100]);
Run Code Online (Sandbox Code Playgroud)
对此:
// #include <cinttypes>
printf("%" PRIu32 "", background[100]);
Run Code Online (Sandbox Code Playgroud)
既然你想要打印uint32_t,而不是打印int.
PS:由于这是C++,我强烈建议使用std::cout,这将自动解决这些问题.
PPS:既然你用过new [],不要忘记delete []事后.