I\xe2\x80\x99m 尝试实现一个仅接受无符号整数类型的函数。以下是我迄今为止尝试过的。它适用于“unsigned int”,但为什么 \xe2\x80\x99t 不能编译为“unsigned Short”?
\n\n#include <iostream>\n#include <type_traits>\n\ntemplate<typename T, class = typename std::enable_if<std::is_unsigned<T>::value>::type>\ninline const T oddProduct(T n) noexcept {\n return (n <= 1) ? n : (n % 2) ? oddProduct(n - 2)*n : oddProduct(--n);\n}\n\nint main() {\n std::cout << "Product of odd integers from 1 to 15: " << oddProduct<unsigned short>(15) << std::endl;\n\n return 0;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n注意:MSVS 2017 社区 C++14 选项。
\nKotlin 1.3 引入了无符号整数类型,但我似乎无法弄清楚如何从ByteArrayKotlin JVM 中的a 获取无符号整数。
Kotlin Native 有一个方便的ByteArray.getUIntAt()方法,但是 Kotlin JVM 不存在这个方法。
val bytes: ByteArray = byteArrayOf(1, 1, 1, 1)
val uint: UInt // = ???
Run Code Online (Sandbox Code Playgroud)
我在这里有哪些选择?有没有比使用 aByteBuffer或位移位更优雅的方法呢?
我以前见过这种问题,但提供的答案并没有让我明白一切。发布此问题时,通常会附上下一个示例:
#include <iostream>
int main()
{
unsigned int u = 10;
int i = -42;
std::cout << i + i << std::endl;
std::cout << i + u << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-84
4294967264
Run Code Online (Sandbox Code Playgroud)
所有按预期工作 int 转换为无符号。但是,如果 的绝对值i小于 ,u则似乎没有发生这种转换。
#include <iostream>
int main()
{
unsigned int u = 10;
int i = -3;
std::cout << i + i << std::endl;
std::cout << i + u << std::endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
-6
7
Run Code Online (Sandbox Code Playgroud)
我没有看到任何提到它的答案,也找不到任何解释。尽管这似乎是合乎逻辑的事情发生,但我对此没有任何解释。
我有一个关于无符号整数的问题。我想将 unsigned int 转换为 char 数组。为此,我使用 itoa。问题是 itoa 可以正常处理 int,但不能处理 unsigned int(unsigned int 被视为普通 int)。我应该如何将 unsigned int 转换为 char 数组?
预先感谢您的帮助!
这是示例:
#include <stdio.h>
int main()
{
int x=35;
int y=-35;
unsigned int z=35;
unsigned int p=-35;
signed int q=-35;
printf("Int(35d)=%d\n\
Int(-35d)=%d\n\
UInt(35u)=%u\n\
UInt(-35u)=%u\n\
UInt(-35d)=%d\n\
SInt(-35u)=%u\n",x,y,z,p,p,q);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
输出:
Int(35d)=35
Int(-35d)=-35
UInt(35u)=35
UInt(-35u)=4294967261
UInt(-35d)=-35
SInt(-35u)=4294967261
Run Code Online (Sandbox Code Playgroud)
我将值声明为有符号整数还是无符号整数真的很重要吗?因为,C实际上只关心我如何从内存中读取值。请帮助我理解这一点,我希望你证明我错了。
我想看看当unsigned long long被分配了一个值的幕后发生了什么unsigned int.我做了一个简单的C++程序来尝试它并将所有io移出main():
#include <iostream>
#include <stdlib.h>
void usage() {
std::cout << "Usage: ./u_to_ull <unsigned int>\n";
exit(0);
}
void atoiWarning(int foo) {
std::cout << "WARNING: atoi() returned " << foo << " and (unsigned int)foo is " <<
((unsigned int)foo) << "\n";
}
void result(unsigned long long baz) {
std::cout << "Result as unsigned long long is " << baz << "\n";
}
int main(int argc, char** argv) {
if (argc != 2) usage();
int …Run Code Online (Sandbox Code Playgroud) 我今天遇到了最奇怪的问题。我正在使用一个在线示例,令我惊讶的是,它不起作用(他们几乎从不这样做)。我自己去修复它,但我似乎被这个错误困住了:
Error: Invalid Conversion from int* to unsigned int* [-fpermissive]
Run Code Online (Sandbox Code Playgroud)
我明白这一点。我正在提供一个int*,它想要一个unsigned int*. 不过,我真的不知道为什么在int*产生的。
这是引发问题的片段代码:
unsigned char md_value[EVP_MAX_MD_SIZE];
int md_length;
EVP_DigestFinal_ex(md_ctx, md_value, &md_length);
Run Code Online (Sandbox Code Playgroud)
该函数调用的第三个参数&md_length导致了问题。查看该函数调用的文档(来自 OpenSSL,如果重要的话),它希望参数是unsigned int*类型的,因为它需要一个地址(或者至少我正在使用的示例是如何使用的)它)。
有趣的是,我认为&操作员返回了一个unsigned int*,因为返回一个int*没有意义,因为计算机的内存中没有负地址。
这是我正在遵循的示例,如果您想看一看:https : //www.openssl.org/docs/crypto/EVP_DigestInit.html
下面是源代码,如果你想自己尝试一下。我怀疑你真的需要阅读它来解决这个问题,但把它放在这里不会有什么坏处。
源代码:
//* Description *//
// Title: Example
// Author: Boom Blockhead
// Example Program to Test OpenSSL
//* Libraries *//
#include <stdio.h>
#include <cstring> …Run Code Online (Sandbox Code Playgroud) 在业余时间,我一直在研究一个实用程序库,除其他外,它支持有符号/无符号的128位整数.在某些情况下,此库使用cpu-dispatching来使用simd指令,但需要可移植的后备,因此它将在其他任何地方运行.最近我实现了128位移位的便携式回退.它运行正常并且运行速度相当快,但它没有我想要的那么快,尤其是在32位架构上.
这是一个带有所有相关类型和功能的剥离版本(包括完整性的64位版本):
typedef uint32_t UInt32;
typedef int32_t Int32;
typedef uint64_t UInt64;
typedef int64_t Int64;
// Returns 0xFFFFFFFF if value != 0, otherwise returns 0.
UInt32 AllOrNothingMask32(Int32 value)
{
return UInt32(-Int32(value != 0));
}
struct alignas(16) UInt128
{
// Ensure the layout matches the architecture.
// LE = little endian
// BE = big endian
#if CPU_TYPE == CPU_LE32
UInt32 mLow;
UInt32 mLowMid;
UInt32 mHighMid;
UInt32 mHigh;
#elif CPU_TYPE == CPU_BE32
UInt32 mHigh;
UInt32 mHighMid;
UInt32 mLowMid;
UInt32 mLow;
#elif CPU_TYPE …Run Code Online (Sandbox Code Playgroud) 我知道无符号整数是臭名昭著的,C++ 开发人员通常会避免使用无符号整数。我有一个包含两个int不应包含负值的成员变量的类:
.
.
.
private:
int m_Y_AxisLen;
int m_X_AxisLen;
.
.
.
Run Code Online (Sandbox Code Playgroud)
我以防止输入任何负数的方式设计了成员函数的逻辑。所以我确保这两个成员不会被分配负值。但是当我使用PVS-Studio
时,这也会带来一些警告。例如这里:
for ( int row = 0; row < getY_AxisLen( ); ++row )
{
for ( int column = 0; column < getX_AxisLen( ) - 1; ++column )
{
if ( m_characterMatrix[ row ][ column ] == getFillCharacter( ) )
{
m_characterMatrix[ row ][ column ] = fillCharacter;
}
}
}
Run Code Online (Sandbox Code Playgroud)
PVS-Studio 责怪我的索引row和类型column不正确memsize。这可能意味着我应该使用std::size_t row …
我有一个关于 C/C++ 中无符号整数的问题。它们以及对它们的运算结果应始终为正或等于零,但与 uint16_t 的差异看起来并非如此。uint 在 C++ 头文件 cstdint 中定义。
下一个程序采用“错误”分支:
uint16_t beg = 7;
uint16_t end = 6;
uint16_t zero = 0;
if (end - beg >= zero) cout << "This branch is always taken.\n";
else cout << "This branch will never be taken.\n";
Run Code Online (Sandbox Code Playgroud)
我在我的计算机(gcc 9.3.0)和编译器资源管理器上进行了测试,结果相同。
为了解决这个问题,我必须将差异转换为 uint16_t:
if (uint16_t(end - beg) >= zero) cout << "This branch is always taken.\n";
else cout << "This branch will never be taken.\n";
Run Code Online (Sandbox Code Playgroud)