为了T使std::is_integral<T>::value && std::is_unsigned<T>::valueIS true,不C++标准保证:
std::numeric_limits<T>::max() == 2^(std::numeric_limits<T>::digits)-1
Run Code Online (Sandbox Code Playgroud)
在数学意义上?我正在寻找基于标准引用的证据.
我有以下数组,我需要在位图上手动操作.
const unsigned int BITS[32] = {1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024,
2048, 4096, 8192, 16384, 32768, 65536, 131072,
262144, 524288, 1048576, 2097152, 4194304,
8388608, 16777216, 33554432, 67108864, 134217728,
268435456, 536870912, 1073741824, 2147483648};
Run Code Online (Sandbox Code Playgroud)
不幸的是,编译时我得到了
警告:此十进制常量仅在ISO C90中无符号
我该如何删除?
我想定义一个模板类,其模板参数将始终是一个整数类型.该类将包含两个成员,一个是类型,另一个是类型T的无符号变体T- 即if T == int,then T_Unsigned == unsigned int.我的第一直觉是这样做:
template <typename T> class Range {
typedef unsigned T T_Unsigned; // does not compile
public:
Range(T min, T_Unsigned range);
private:
T m_min;
T_Unsigned m_range;
};
Run Code Online (Sandbox Code Playgroud)
但它不起作用.然后我考虑使用部分模板专业化,如下所示:
template <typename T> struct UnsignedType {}; // deliberately empty
template <> struct UnsignedType<int> {
typedef unsigned int Type;
};
template <typename T> class Range {
typedef UnsignedType<T>::Type T_Unsigned;
/* ... */
};
Run Code Online (Sandbox Code Playgroud)
只要您UnsignedType对每个整数类型进行部分专门化,这都可以.这是一些额外的复制粘贴工作(削减明智地使用宏),但可以使用. …
我收到警告:
Pe186"无符号int与零的无意义比较"
当我尝试编译以下代码时:
for(clLoop = cpLoopStart; clLoop >= 0; clLoop--)
{
//Do something
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么.我能理解,如果我正在寻找一个小于零的值,因为一个unsigned int永远不会是负面的.但是,所有我在这里寻找是,如果它是等于为零,其中unsigned int当然也可以.
我甚至可以看到这个错误,如果在这个循环中我试图预先减少而不是后减量,但是情况并非如此.
我认为((1 ? (int)1 : (unsigned int)2) > -1)结果是1(true),但实际上它0在Visual Studio 2017中是(假的).
我认为价值(1 ? (int)1 : (unsigned int)2)应该是(int)1,因为1 ?是真的,而且1 > -1是真的.
我不知道为什么这个表达式的最终结果是错误的.
当我尝试转换时((int)(1 ? (int)1 : (unsigned int)2) > -1),它返回1(true).
signed int test = -1;
signed int si = 1;
unsigned int ui = 2;
printf("%d\n", ((1 ? si : ui) > test));
return 0;
Run Code Online (Sandbox Code Playgroud)
我希望输出是1,但实际输出是0.
如何在C中正确地将char*复制到unsigned char*.以下是我的代码
int main(int argc, char **argv)
{
unsigned char *digest;
digest = malloc(20 * sizeof(unsigned char));
strncpy(digest, argv[2], 20);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我想正确地将char*数组复制到unsigned char*数组.我使用上面的代码得到以下警告
warning: pointer targets in passing argument 1 of âstrncpyâ differ in signedness
Run Code Online (Sandbox Code Playgroud)
编辑:添加更多信息,我的要求是调用者在主函数中提供SHA摘要作为命令行上的字符串,主函数在内部将其保存在摘要中.SHA摘要可以使用unsigned char最好地表示.
现在的问题是我无法更改main函数(**char)的签名,因为main函数解析了它需要的其他参数作为char*而不是unsigned char*.
这是一个我坚持的功课问题.
考虑无符号整数表示.存储包含以下内容的十进制数需要多少位:
i) 3 digits ii) 4 digits iii) 6 digits iv) n digits
Run Code Online (Sandbox Code Playgroud)
我知道无符号整数的范围是0到2 ^ n,但我不知道表示数字所需的位数如何取决于它.请帮帮我.
提前致谢.
我正在学习C++语言,我对类型转换有一些疑问,你能解释一下像这样的表达式会发生什么:
unsigned int u = 10;
int a = -42;
std::cout << u - a << std::endl;
Run Code Online (Sandbox Code Playgroud)
在这里我知道如果我在有两个数学运算符时应用规则,结果将是52.但我想知道当编译器将a转换为无符号值时会发生什么情况会产生一个临时的无符号类型,之后会发生什么?表达式现在应该是10 -4294967254.
我知道unsigned int不能保持负值.但是以下代码编译时没有任何错误/警告.
unsigned int a = -10;
Run Code Online (Sandbox Code Playgroud)
当我打印变量a时,打印出错误的值.如果无符号变量不能保存有符号值,为什么编译器允许它们编译而不给出任何错误/警告?
有什么想法吗?
编辑
编译器:VC++编译器
解
需要使用警告级别4.
例如,做:
wchar_t x;
Run Code Online (Sandbox Code Playgroud)
翻译成:
unsigned short x;
Run Code Online (Sandbox Code Playgroud)