最近,我在尝试.size()用 C++ 减去两个字符串的值时遇到了一个问题。据我所知,size()返回字符串中的字符数。假设我有 2 个字符串p,并且q,abs(p.size()-q.size())应该返回两个字符串的长度差异。但是当我运行这段代码时,它返回了一个突然很大的值。当我单独打印两者的长度或者如果我将它们的长度值存储在不同的整数中并减去它们时,它们会给我正确的答案。我还无法弄清楚为什么。
有人可以解释一下 VHDL 的to_unsigned是如何工作的或者确认我的理解是正确的吗?例如:
C(30 DOWNTO 0) <= std_logic_vector (to_unsigned(-30, 31))
Run Code Online (Sandbox Code Playgroud)
这是我的理解:
unsigned type-conversion vhdl twos-complement signed-integer
我是一个真正的 C 新手,我正在尝试在 C 中运行以下代码:
#include <stdio.h>
int main()
{
unsigned long i = 1UL << 2;
int j = (i==4);
printf('%d', j);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但它给出了错误:
prog.c: In function 'main':
prog.c:6:10: warning: multi-character character constant [-Wmultichar]
printf('%d', j);
^
prog.c:6:10: warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion]
In file included from prog.c:1:0:
/usr/include/stdio.h:362:12: note: expected 'const char * restrict' but argument is of type 'int'
extern int printf (const char *__restrict __format, …Run Code Online (Sandbox Code Playgroud) 我正在阅读《C++ 如何编程》第 9 版,尝试学习 C++,并尝试使用第 7 章中的骑士问题进行练习。
根据输出中的“64”,代码显然存在某种逻辑错误(我将自行修复),但在执行此操作之前,我一直致力于理解以及如何处理编译器警告。
我已将 board 声明为 unsigned int 的二维数组,因为它只能包含值 0-7。同样,出于同样的原因,我将 for 循环中的变量声明为 unsigned int。
我在 stackoverflow 上读过有关此问题的回复,但它们很快就超出了我的理解范围。
#include <iostream>
#include <array>
#include <iomanip>
using namespace std;
void printArray(const array< array< unsigned int, 8 >, 8 >);
int main() {
array< array< unsigned int, 8 >, 8 > board = {};
array< int, 8 > horizontal = {{ 2, 1, -1, -2, -2, -1, 1, 2 }};
array< int, 8 > vertical = {{ -1, -2, …Run Code Online (Sandbox Code Playgroud) 我发现了一些关于这个特定主题的问题,但它们都是关于 C++ 的。
将 -1 分配给 unsigned int 以获得最大值是否安全?
在阅读答案时,这似乎是 C 和 C++ 不同之处之一,这似乎是可能的,或者至少不是不可能的。
问题很简单:
如果我声明一个变量unsigned char/short/int/long var或使用任何其他无符号类型,如固定宽度、最小宽度等,那么是否保证var = -1将设置var为它可以容纳的最大值?该程序是否保证打印“是”?
#include <stdio.h>
#include <limits.h>
int main(void) {
unsigned long var = -1;
printf("%s\n", var == ULONG_MAX ? "Yes" : "No");
}
Run Code Online (Sandbox Code Playgroud) 我想存储一个寄存器值并执行bitwise NOT operator如下操作
typedef union TEST_REG {
uint32_t u32Register;
uint8_t Byte[4];
uint16_t hword[2];
} tst_reg;
#define TEST_REGISTER ((volatile tst_reg*) 0x7023100CUL) // Register
Run Code Online (Sandbox Code Playgroud)
下面是存储值的示例代码
#define CHECK_FLAG (0x00000004)
TEST_REGISTER->u32Register &= (uint32_t)(~(CHECK_FLAG));
Run Code Online (Sandbox Code Playgroud)
但是当我执行TEST_REGISTER->u32Register &= (uint32_t)(~(CHECK_FLAG));代码时,QAC会抛出类似的警告
Constant: Negative value cast to an unsigned type
Run Code Online (Sandbox Code Playgroud)
我知道如果我们这样做,NOT (~) operator十六进制值将更改为负数。
所以我想知道如何正确地将负值转换为无符号类型?有什么建议 ?
如果我定义该unsigned int类型的变量并使用其范围之外的值对其进行初始化,那么它会使用模并为自己分配一个在其范围内的值,对吧?
例如:
unsigned int a = 4294967298;
std::cout << a << std::endl;
Run Code Online (Sandbox Code Playgroud)
将打印2.
但是,如果不是这样,我写:
std::cout << 4294967298u << std::endl
Run Code Online (Sandbox Code Playgroud)
它打印4294967298而不打印2。
这是为什么?
我认为我们在这两个例子中做了几乎相同的事情。
是因为在第二个示例中,默认情况下文字不是int, butlong或其他东西,并且我们unsigned long通过添加u作为后缀将其转换为?那么,我们如何将它用作unsigned int文字呢?
让我们考虑一个函数来获取一个人的出生日期并返回他的年龄(整年).如果日期是将来它会引发异常.它应该返回什么类型 - uint或int?uint似乎是合乎逻辑的自然约束.或者使用更常见的int更好吗?
我试图减去两个无符号整数并将结果与有符号整数(或文字)进行比较.使用unsigned int类型时,行为符合预期.当使用uint16_t(from stdint.h)类型时,行为不是我所期望的.使用gcc 4.5进行比较.
给出以下代码:
unsigned int a;
unsigned int b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
Run Code Online (Sandbox Code Playgroud)
输出为0,这是我的预期.a和b都是无符号的,b大于a,因此结果是一个大的无符号数,大于10.现在如果我改变a和b来输入uint16_t:
uint16_t a;
uint16_t b;
a = 5;
b = 20;
printf("%u\n", (a-b) < 10);
Run Code Online (Sandbox Code Playgroud)
输出为1.这是为什么?两个uint16_t类型之间的减法结果是存储在gcc中的int中吗?如果我更改10为10U输出再次为0,这似乎支持这一点(如果减法结果存储为int并且与unsigned int进行比较,则减法结果将转换为unsigned int).
我试图BigInteger用来表示long来自Java中的C 的无符号64位(),我的方法与下面的帖子中提到的完全相同.
http://technologicaloddity.com/2010/09/22/biginteger-as-unsigned-long-in-java/
你们其中一个人可以证实这种方法是正确的吗?
在这方面的任何帮助表示赞赏.