integer-promotion相关内容

两个字符相加产生 int

我做了一个简单的程序,用 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"可能会改变其值 对于以下代码,我收到了同样的警告: ..
发布时间:2022-01-14 14:16:36 C/C++开发

一个 double 是否将方程中的每个 int 都提升为 double?

是否存在一种浮点数据类型(例如 double)确保所有 +、-、*、/、% 等数学运算都采用双操作数? 如果故事比这更复杂,是否有资源可以描述这些规则?当等式的结果是 double 时,我是否应该不问这样的问题并始终明确地将 int 转换为 double.这是我正在考虑的一些方程式.我故意没有在我的系统上编译和运行,因为这可能是编译器依赖的类型. int a(1), b(2), c(3); ..
发布时间:2022-01-09 10:53:20 C/C++开发

大小小于 int 的位域是否应该作为积分提升的主题?

假设我有以下 struct: 结构体A{无符号整数 a : 1;无符号整数 b : 1;}; 我感兴趣的是表达式a + b 的类型.虽然从技术上讲位域具有小于 int 的“类型",因此可能应该发生积分提升,然后结果是 int 就像它恰好在 gcc 和 clang 中一样. 但是由于不可能提取位字段本身的确切类型,并且它总是会被推导出它的“大"类型(即 unsigned int 在这种情况 ..

C 中的类型提升

我对以下代码感到很困惑: #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 ..
发布时间:2021-12-25 13:33:54 其他开发

Bitshift 和整数提升?

通常,C 要求二元运算符的操作数提升为更高级别操作数的类型.这可以用来避免使用冗长的强制转换填充代码,例如: if (x-48U 等 但是,我发现,至少对于 gcc,这种行为不适用于位移位.即 int x = 1;unsigned long long y = x 我希望右手操作数的类型导致左手操作数被提升为 unsigned long long 以便转换成功.但相反,gcc 会打印 ..
发布时间:2021-12-18 22:58:36 其他开发

为什么在 C 和 C++ 中的算术运算之前必须将 short 转换为 int?

从我从这个问题得到的答案来看,C++似乎继承了对short的转换的这个要求 在从 C 执行算术运算时转换为 int.我可以请您思考一下为什么这是第一个在 C 中引入的地方?为什么不将这些操作作为 short 进行? 例如(摘自 dyp 在评论中的建议): short s = 1, t = 2 ;自动 x = s + t ; x 的类型为 int. 解决方案 如果我们看国际标准的基 ..
发布时间:2021-12-01 15:34:20 C/C++开发

为什么一元减号进行积分提升?

const auto min = -std::numeric_limits::max();T x = 分钟;//从 'const int' 到 'short' 的转换,可能会丢失数据 T 是一个模板参数,在这种情况下是一个 short.一元减法显然执行了积分提升. 为什么一元减号会执行积分提升? 如果将 auto 更改为 T 不会生成警告,但应该将 int 分配给 short.为什么没有 ..
发布时间:2021-11-30 18:18:53 C/C++开发

整数提升(MISRA C:2012 Rule 7.2)

MISRA强制对无符号整数常量使用 U 后缀 uint32_t the_answer = 0x42U; 我觉得 U 有点像样板,因为没有它,这行很容易理解. 所以我想知道这个规则有多重要,以及 unsigned int x = 1 是否真的是隐式整数提升的错误示例. 解决方案 您是正确的,根据规则10.3的例外,此特定示例中的U是多余的: “如果一个基本符号类型的非负整 ..
发布时间:2021-05-16 19:14:04 其他开发

字符会在C表达式中自动提升吗?

我向我的一位同事发了言: “字符会在C表达式中自动提升为整数,这对性能很好,因为CPU的自然字长最快. 我认为,由于字符的排名,字符提升行为在标准中有所说明. 这是我得到的答复: “字符未默认提升为整数.寄存器大小是32位,但可以将一行中的多个字节值打包到一个单寄存器作为编译器实现.这并不总是预测性的.您唯一可以验证自动升级的时间是当类型不包装在一个结构,因为C标准正式需要 ..
发布时间:2021-04-21 20:17:13 C/C++开发

C ++意外整数提升

最近我正在编写一些本应用于测试其他代码的代码,但我偶然发现了一个令人惊讶的整数提升案例.这是最小的测试用例: #include#includeint main(){std :: uint8_t a,b;a = std :: numeric_limits :: max();b = a;a = a + 1;如果(a!= b + ..
发布时间:2021-04-19 19:58:15 C/C++开发

无符号8位整数的左移运算

我试图理解C/C ++中的移位运算符,但是它们给了我一个艰难的时刻. 我有一个无符号的8位整数,初始化为一个值,例如说1. uint8_t x = 1; 据我所知,它在内存中的表示方式类似于 | 0 | 0 | 0 | 0 | 0 || 0 ||| 0 || 1 | .现在,当我尝试将变量x保留16位时,我希望获得输出 0 .但是令我惊讶的是,我得到了 65536 .我肯定会缺少 ..
发布时间:2021-04-15 19:56:26 C/C++开发

为什么C/C ++会自动将char/wchar_t/short/bool/enum类型转换为int类型?

因此,据我所知,整数提升提供:•char, wchar_t, bool, enum, short类型始终转换为int(或unsigned int).然后,如果表达式中的类型不同,将应用进一步的转换. 我了解得很好吗? 如果是,那么我的问题是:为什么好呢?为什么?不要成为char/wchar_t/bool/enum/short不必要的吗?我的意思是例如: char c1; char ..
发布时间:2020-06-26 19:01:26 C/C++开发

为什么在添加两个字符时没有整数溢出?

可能重复: 两个字符相加会生成int 给出以下C ++代码: unsigned char a = 200; unsigned char b = 100; unsigned char c = (a + b) / 2; 根据逻辑上的预期输出为150,但是在表达式(a + b)中不应该存在整数溢出? 很显然,这里必须有一个整数提升来处理溢出,否则我看不到发生了其他事情.我想知道 ..
发布时间:2020-06-26 19:01:23 C/C++开发

算术转换VS积分提升

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 ..
发布时间:2020-06-26 19:01:21 C/C++开发

无符号字符的按位求反

这是一个与c99标准相关的问题,涉及整数提升和未签名字符的按位求反. 在6.5.3.3节中指出: 对操作数执行整数提升,结果 具有提升的类型.如果提升的类型是无符号类型,则 表达式〜E等于其中可表示的最大值 输入减号E. 我说的那句话我理解正确吗? unsigned int ui = ~ (unsigned char) ~0; // ui is now 0xFF00. ..
发布时间:2020-06-26 19:01:17 其他开发