我试图理解为什么以下代码不会在指定的位置发出警告.
//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) 假设我有以下内容struct:
struct A
{
unsigned int a : 1;
unsigned int b : 1;
};
Run Code Online (Sandbox Code Playgroud)
我感兴趣的是表达的类型a + b.虽然技术上比特字段的"类型"大小小于int整数提升可能应该发生,然后结果int就像它碰巧在gcc和clang中.
但是,由于不可能提取出精确类型的位域本身,并且它总是被推断为它的"大"类型(即unsigned int在这种情况下)是否正确,整体推广应该发生?因为我们实际上无法谈论比特字段的确切类型和大小,除非它们被推断为unsigned int在哪种情况下不应该进行整体提升.
(我的问题再一次源于MSVC碰巧认为unsigned int这种表达的类型)
c++ integer-promotion language-lawyer bit-fields visual-studio-2015