integer-promotion相关内容
我做了一个简单的程序,用 GCC 4.4/4.5 编译如下: int main(){字符u = 10;字符 x = 'x';字符 i = u + x;返回0;} g++ -c -Wconversion a.cpp 我有以下内容: a.cpp:在函数“int main()"中:a.cpp:5:16:警告:从“int"转换为“char"可能会改变其值 对于以下代码,我收到了同样的警告:
..
假设如下: unsigned char foo = 3;无符号字符条 = 5;无符号整数 shmoo = foo + bar; foo 和 bar 值是否保证被提升为 int 值以评估表达式 foo + bar -- 或者是否允许实现将它们提升为 unsigned int? 在第 6.2.5 节第 8 段: 对于任意两个具有相同符号和不同整数转换等级的整数类型(见 6.3.1.1)
..
是否存在一种浮点数据类型(例如 double)确保所有 +、-、*、/、% 等数学运算都采用双操作数? 如果故事比这更复杂,是否有资源可以描述这些规则?当等式的结果是 double 时,我是否应该不问这样的问题并始终明确地将 int 转换为 double.这是我正在考虑的一些方程式.我故意没有在我的系统上编译和运行,因为这可能是编译器依赖的类型. int a(1), b(2), c(3);
..
假设我有以下 struct: 结构体A{无符号整数 a : 1;无符号整数 b : 1;}; 我感兴趣的是表达式a + b 的类型.虽然从技术上讲位域具有小于 int 的“类型",因此可能应该发生积分提升,然后结果是 int 就像它恰好在 gcc 和 clang 中一样. 但是由于不可能提取位字段本身的确切类型,并且它总是会被推导出它的“大"类型(即 unsigned int 在这种情况
..
我对以下代码感到很困惑: #include #include int main(int argc, char ** argv){uint16_t a = 413;uint16_t b = 64948;fprintf(stdout, "%u\n", (a - b));fprintf(stdout, "%u\n", ((uint16_t) (a - b)));返回0;} 返回: $ gcc -W
..
我尝试执行以下程序: #include int main() {有符号字符 a = -5;无符号字符 b = -5;int c = -5;无符号整数 d = -5;如果 (a == b)printf("\r\n 字符是一样的!!!");别的printf("\r\n 字符是不同的!!!");如果(c == d)printf("\r\n int 是一样的!!!");别的printf("\r\n in
..
通常,C 要求二元运算符的操作数提升为更高级别操作数的类型.这可以用来避免使用冗长的强制转换填充代码,例如: if (x-48U 等 但是,我发现,至少对于 gcc,这种行为不适用于位移位.即 int x = 1;unsigned long long y = x 我希望右手操作数的类型导致左手操作数被提升为 unsigned long long 以便转换成功.但相反,gcc 会打印
..
从我从这个问题得到的答案来看,C++似乎继承了对short的转换的这个要求 在从 C 执行算术运算时转换为 int.我可以请您思考一下为什么这是第一个在 C 中引入的地方?为什么不将这些操作作为 short 进行? 例如(摘自 dyp 在评论中的建议): short s = 1, t = 2 ;自动 x = s + t ; x 的类型为 int. 解决方案 如果我们看国际标准的基
..
const auto min = -std::numeric_limits::max();T x = 分钟;//从 'const int' 到 'short' 的转换,可能会丢失数据 T 是一个模板参数,在这种情况下是一个 short.一元减法显然执行了积分提升. 为什么一元减号会执行积分提升? 如果将 auto 更改为 T 不会生成警告,但应该将 int 分配给 short.为什么没有
..
我是否正确理解该程序导致UB的标准: #includeint main(无效){char a ='A';printf(“%c \ n",a);返回0;} 在 sizeof(int)== 1&&CHAR_MIN == 0 ? 因为如果 a 是未签名的并且具有与 int 相同的大小(1),它将被提升为 unsigned int [1](2),而不是 int ,因为 i
..
MISRA强制对无符号整数常量使用 U 后缀 uint32_t the_answer = 0x42U; 我觉得 U 有点像样板,因为没有它,这行很容易理解. 所以我想知道这个规则有多重要,以及 unsigned int x = 1 是否真的是隐式整数提升的错误示例. 解决方案 您是正确的,根据规则10.3的例外,此特定示例中的U是多余的: “如果一个基本符号类型的非负整
..
这可能是一个非常基本的问题,但我无法解决.这就是我的工作. #includeint main(无效){字符c1,c2;int s;c1 = 128;c2 = -128;s = sizeof(字符);printf("char的大小:%d \ n",s);printf("c1:%x,c2:%x \ n",c1,c2);printf("true或false:%d \ n",c1
..
我向我的一位同事发了言: “字符会在C表达式中自动提升为整数,这对性能很好,因为CPU的自然字长最快. 我认为,由于字符的排名,字符提升行为在标准中有所说明. 这是我得到的答复: “字符未默认提升为整数.寄存器大小是32位,但可以将一行中的多个字节值打包到一个单寄存器作为编译器实现.这并不总是预测性的.您唯一可以验证自动升级的时间是当类型不包装在一个结构,因为C标准正式需要
..
为什么在C ++ 11中将 unsigned short * unsigned short 转换为 int ? int 太小,无法处理此代码行所示的最大值. cout
..
最近我正在编写一些本应用于测试其他代码的代码,但我偶然发现了一个令人惊讶的整数提升案例.这是最小的测试用例: #include#includeint main(){std :: uint8_t a,b;a = std :: numeric_limits :: max();b = a;a = a + 1;如果(a!= b +
..
我试图理解C/C ++中的移位运算符,但是它们给了我一个艰难的时刻. 我有一个无符号的8位整数,初始化为一个值,例如说1. uint8_t x = 1; 据我所知,它在内存中的表示方式类似于 | 0 | 0 | 0 | 0 | 0 || 0 ||| 0 || 1 | .现在,当我尝试将变量x保留16位时,我希望获得输出 0 .但是令我惊讶的是,我得到了 65536 .我肯定会缺少
..
因此,据我所知,整数提升提供:•char, wchar_t, bool, enum, short类型始终转换为int(或unsigned int).然后,如果表达式中的类型不同,将应用进一步的转换. 我了解得很好吗? 如果是,那么我的问题是:为什么好呢?为什么?不要成为char/wchar_t/bool/enum/short不必要的吗?我的意思是例如: char c1; char
..
可能重复: 两个字符相加会生成int 给出以下C ++代码: unsigned char a = 200; unsigned char b = 100; unsigned char c = (a + b) / 2; 根据逻辑上的预期输出为150,但是在表达式(a + b)中不应该存在整数溢出? 很显然,这里必须有一个整数提升来处理溢出,否则我看不到发生了其他事情.我想知道
..
char cval; short sval; long lval; sval + cval; // sval and cval promoted to int cval + lval; // cval converted to long 这是C ++ Primer上的一段代码. 我知道sval+cval根据 生成一个int类型 将小整数类型转换为大整数类型.类型 bool,char,s
..
这是一个与c99标准相关的问题,涉及整数提升和未签名字符的按位求反. 在6.5.3.3节中指出: 对操作数执行整数提升,结果 具有提升的类型.如果提升的类型是无符号类型,则 表达式〜E等于其中可表示的最大值 输入减号E. 我说的那句话我理解正确吗? unsigned int ui = ~ (unsigned char) ~0; // ui is now 0xFF00.
..