我试图理解为什么以下代码不会在指定的位置发出警告.
//from limits.h
#define UINT_MAX 0xffffffff /* maximum unsigned int value */
#define INT_MAX 2147483647 /* maximum (signed) int value */
/* = 0x7fffffff */
int a = INT_MAX;
//_int64 a = INT_MAX; // makes all warnings go away
unsigned int b = UINT_MAX;
bool c = false;
if(a < b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a > b) // warning C4018: '<' : signed/unsigned mismatch
c = true;
if(a <= b) // warning C4018: …Run Code Online (Sandbox Code Playgroud) 我很想知道如果我给无符号变量赋一个负值会发生什么.
代码看起来有点像这样.
unsigned int nVal = 0;
nVal = -5;
Run Code Online (Sandbox Code Playgroud)
它没有给我任何编译器错误.当我运行程序时,nVal分配了一个奇怪的值!是否可以将某个2的补码值分配给nVal?
严格地说,在转换之前两个数字的位表示是相同的并不重要.即使使用1的补码或带符号的幅度表示,(带符号)-1到无符号长的转换也总是会产生
ULONG_MAX.(转换后的位模式将相同).
我知道你可以-1用其他方式代表Two's Compliment,这是一个有效的补充,应该在我的答案中.但是,在这样的实现中,依赖转换是否安全ULONG_MAX?