请参阅我下面的代码。我很困惑为什么我需要先将变量转换var_u16为int16_t ,然后再转换为int32_t以便在 MyFunc() 中正确解释为有符号 int。
我本以为,由于var_u16最高有效位为 1,当简单地转换为 int32_t 时,编译器会理解这是一个负值。
相反,它仍然被解释为无符号值。为什么需要先中间转换为int16_t?
我正在使用 gcc 8.3.0
#include <stdio.h>
void MyFunc(int32_t s32Var)
{
printf("%d\n", s32Var);
}
int main()
{
uint16_t var_u16 = 0x8000;
MyFunc((int32_t)var_u16); // prints 32768
MyFunc((int32_t)(int16_t)var_u16); // prints -32768
return 0;
}
Run Code Online (Sandbox Code Playgroud)
unsigned char x = 0;
unsigned char y = 150;
x = 2 * y;
cout << "x: " << (int)x << endl; // returns 44
Run Code Online (Sandbox Code Playgroud)
我知道 unsigned char 表示从 0 到 255 的 ASCII 字符,但我不知道为什么 x 打印我们的 44。
有人有我可以遵循的 ASCII 图表吗?
就在我虽然对 Java 如何将所有整数/字节等视为有符号数字有一定的了解时,它又用另一个曲线球击中了我,让我思考我是否真的了解这种处理方式。
这是一段汇编代码,如果满足条件(确实满足),它应该跳转到一个地址。PC 就在跳转之前C838h,然后在条件检查之后,它应该是:C838h + FCh(h = hex),我认为它会被视为有符号,因此 PC 会向后跳转:FCh = -4 in two's compliment negative number。但令我惊讶的是,java ADDED FCh 到 PC 使其错误地跳转到C934h而不是返回到C834h.
C832: LD B,04 06 0004 (PC=C834)
C834: LD (HL), A 77 9800 (PC=C835)
C835: INC L:00 2C 0001 (PC=C836)
C836: JR NZ, n 20 00FC (PC=C934)
Run Code Online (Sandbox Code Playgroud)
我在 Java 代码中对此进行了测试,结果确实相同:
int a = 0xC838;
int b = 0xFC;
int result = a + b; …Run Code Online (Sandbox Code Playgroud) 我想将 a 添加isize到 ausize并包括边界检查,以便结果不会溢出 a 的边界usize。如何才能做到这一点?
由于我的数值分析课程考试临近,我正在寻找在 C/C++ 中表示浮点数的实现代码?然后我在github上找到了一行代码。您能告诉我,下面代码片段中第二行的含义是什么,以及它为何如此重要?
float x = ...;
unsigned u = *(unsigned*)&x;
Run Code Online (Sandbox Code Playgroud) int当我在 C 和 C++ 开发中使用or long、char、short等时,我一直知道我有符号值。顺便说一句,根据编译器或操作系统的不同,当这些类型的默认符号变为无符号时会发生什么?我之所以询问,是因为我从未在论文或书籍中看到过对此的引用,而且我也不知道。
我想转换char*str ="10.20.30.40"; in to unsigned int.你可以告诉我任何方法或任何示例代码.请跟我分享一下
我正在将一些C++代码移植到Java代码中.
java中没有无符号数据类型,可以容纳64位.
我有一个哈希码,它存储在Java的long数据类型中(当然是签名的).
long vp = hashcode / 38; // hashcode is of type 'long'
Run Code Online (Sandbox Code Playgroud)
由于此处的38大于2,因此结果数可以安全地用于java中的任何其他算术.
问题是如果'hashcode'中的signed bit设置为1.我不想在变量vp中得到负值.我想要一个正值,好像数据类型是无符号的.
PS:由于性能问题,我不想为此目的使用Biginteger.
我遇到了一种行为,我没想到在无符号整数上使用按位运算.我会切入我的榜样.
unsigned int a = 0;
unsigned int b = 0;
std::printf("a & b: %u\n", a & b);
std::printf("a == b: %i\n", a == b);
std::printf("a & b == a: %i\n", a & b == a);
Run Code Online (Sandbox Code Playgroud)
上面的代码产生以下输出:
a & b: 0
a == b: 1
a & b == a: 0
Run Code Online (Sandbox Code Playgroud)
最后一行让我感到困惑.不应该a & b == a评估true,因为a & b == (unsigned int)0和a == (unsigned int)0?
我一直都是,只要我记得并无处不在,就这样做了:
for (unsigned int i = 0U; i < 10U; ++i)
{
// ...
}
Run Code Online (Sandbox Code Playgroud)
换句话说,我U在无符号整数上使用说明符.现在看了很长时间,我想知道为什么我这样做.除了表示意图之外,我想不出为什么它在像这样的琐碎代码中有用的原因?
是否有一个有效的编程原因,为什么我应该继续这个约定,还是多余的?