我不敢承认,我已经有一段时间没有使用 C++了,但我现在不得不使用了,而且我有点生疏了。
我需要一个位图,而且我确实关心性能,我的位图大小将不再是 25 位。
我正在考虑使用 unsigned int,但恐怕我不记得它是如何在 c/c++ 中
实现的 unsigned int 是作为常规二进制数实现的吗?
我也对位图的任何其他建议持开放态度。
在此先感谢您的帮助!
我正在为它制作一个虚拟机和一个C编译器.我没有得到的是大多数指令集有IMUL和IDIV但不是ISUB和IADD.由于sub通常是unsigned sub,我怎么能像x86那样做
MOV EAX,1
MOV EDX,3
SUB EAX,EDX,EAX
Run Code Online (Sandbox Code Playgroud)
得到-2?
在纯ANSI C(C89)中,我有以下内容.
unsigned y=<smallnumber>,x=y+3;
printf("%<whatgoeshere>\n",x-y);
Run Code Online (Sandbox Code Playgroud)
我%绝对肯定会打印后放入什么3?我可以在这里看到两者的参数%u(如果两个操作数都是无符号的结果)和%d(int在传递参数时将积分表达式转换为printf).
当然,两者都适用于任何合理的编译器,这正是我在这里问的原因.:-)我感觉只有一个是真正正确的标准(但即使这可能是错误的).
我相当肯定uint8_t从另一个中减去一个应该导致另一个无符号数,但我的一些结果让我感到困惑.
uint8_t a = 2;
uint8_t b = 1;
uint8_t c = -a;
long d = b - a;
long e = b + c;
Run Code Online (Sandbox Code Playgroud)
当我获得d它产生的价值时-1,e正如我所期望的那样255.这是gcc我正在使用的版本的错误.....对吗?
作为参考,我正在使用arm-none-eabi-g++编译器MSP-432.
看着这似乎表明gcc这里似乎犯了同样的错误.
看看这个问题似乎看起来像神弩和手臂gcc是错误的.
这里发生了什么?
我们有两个无符号计数器,我们需要比较它们以检查一些错误条件:
uint32_t a, b;
// a increased in some conditions
// b increased in some conditions
if (a/2 > b) {
perror("Error happened!");
return -1;
}
Run Code Online (Sandbox Code Playgroud)
问题是,a并b会溢出一些日子.如果a溢出,它仍然可以.但如果b溢出,那将是一种误报.如何使这个检查防弹?
我知道制作a并b uint64_t会延迟这种误报.但它仍然无法完全解决这个问题.
===============
让我澄清一点:计数器用于跟踪内存分配,这个问题可以在dmalloc/chunk.c中找到:
#if LOG_PNT_SEEN_COUNT
/*
* We divide by 2 here because realloc which returns the same
* pointer will seen_c += 2. However, it will never be more than
* twice the iteration value. We divide …Run Code Online (Sandbox Code Playgroud) 我可以描述这个“圆形”六边形网格的尺寸..
..n在编译时只定义了1 个值:
const GRID_RADIUS: usize = 3;
Run Code Online (Sandbox Code Playgroud)
因此,网格中的单元格数量在编译时也是已知的,因为它是(2n+1)^2-n*(n+1)(此处为 37)。
但是,以下内容:
const GRID_RADIUS: usize = 3;
Run Code Online (Sandbox Code Playgroud)
不编译:
const N: usize = 3;
const N_CELLS: usize = ((2 * N + 1) ^ 2) - N * (N + 1);
struct Cell;
struct Grid {
cells: [Cell; N_CELLS],
}
Run Code Online (Sandbox Code Playgroud)
我知道rustc担心减去usize类型可能会导致溢出,但我可以保证N_CELLS在这种情况下总是积极的。
我怎么能为此承担责任并rustc信任我?
compiler-errors constants integer-overflow unsigned-integer rust
当 i 达到 -1 时,以下代码将由于整数溢出而产生段错误。如果我将“unsigned int i”更改为“char i”,那么它将正常工作,但会生成编译器警告“数组下标具有类型'char'”。将其声明为“int i”会很好地工作,并且不会出现编译器警告,但感觉应该有。毕竟 int 也是有符号的,并且也可能变为负值。我的问题是,是否有一种安全、优雅、惯用的方式在 C 中编写此类循环?
#include <stdio.h>
int main() {
unsigned int i;
char a[10] = {0};
for (i = 9; i >= 0; i--) {
printf("a[%d]: %d\n", i, a[i]);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud) 我在这里试图将4位六进制转换为dec但是没有成功.这是我的代码.
unsigned int array[4];
printf("Type in 4-digit hexa: \n");
scanf("%x", &array);
while(getchar() != '\n');
printf("Your number in dec is %u \n", array);
Run Code Online (Sandbox Code Playgroud)
我不知道它有什么问题,但它不会给出正确的dec输出.就像我放入EEFF一样,它应该发出61183但程序仍然打印出65518.
这个号码来自哪里?我的代码出了什么问题?根据我的考虑,我使用unsigned int,FFFF等于65385,unsigned int的范围是0到65535.数据范围应该没有问题,我也使用了%u.
在我完成一些搜索之后,我现在唯一能想到的就是这个问题可能与unsigned int的大小有关,也可能与int或sth有关.我读了解释但不太明白.
我知道,这可能是一个重复,但我在这里要求更简单地解释为什么这不起作用.说实话,我对这个网站和编程都是一个绝对新手,所以请用编码方便我.仅供参考,除了stdio.h之外我什么都不知道.
我有两个函数add和main如下.
int add(unsigned int a, unsigned int b)
{
return a+b;
}
int main()
{
unsigned int a,b;
cout << "Enter a value for a: ";
cin >> a;
cout << "Enter a value for b: ";
cin >> b;
cout << "a: " << a << " b: "<<b <<endl;
cout << "Result is: " << add(a,b) <<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当我运行这个程序时,我得到以下结果:
Enter a value for a: -1
Enter a value for b: -2
a: 4294967295 b: 4294967294
Result …Run Code Online (Sandbox Code Playgroud) 我是新来的C++,并想知道如果有之间的差异uint32_t和tUInt32?它只是语法糖吗?或者它只是结果using namespace std;?
我知道它们代表什么(参见:https://www.badprog.com/c-type-what-are-uint8-t-uint16-t-uint32-t-and-uint64-t).我很困惑为什么有两种不同的方式来表示它们以及使用哪种方法.
虽然我已搜查所以用uint32_t和tUInt32,我希望这不是一个重复.
感谢您的时间.