82得票4回答
为什么在 C 和 C++ 中进行算术运算前必须将 short 转换为 int?

从我在这个问题中得到的答案来看,似乎C++继承了C语言将short转换为int进行算术运算的要求。请问,为什么C语言最初要引入这个要求呢?为什么不直接使用short进行这些操作呢? 例如(从评论中dyp的建议中摘录): short s = 1, t = 2 ; auto x = s + ...

74得票5回答
类型转换 - 无符号整数到有符号整数/字符

我尝试执行以下程序:#include <stdio.h> int main() { signed char a = -5; unsigned char b = -5; int c = -5; unsigned int d = -5; if...

42得票4回答
为什么'char -> int'是提升,而'char -> short'是转换(但不是提升)?

我已阅读cppreference.com的隐式转换: 整数提升: 小整数类型(如char)的prvalue可以转换为大整数类型(如int)的prvalue。 [...] 请注意,所有其他转换都不是提升;例如,重载解析会选择char -> int(提升),而不是char -> short(转...

39得票3回答
为什么在一个表达式中同时使用左移和右移会有所区别?

我有以下代码:unsigned char x = 255; printf("%x\n", x); // ff unsigned char tmp = x << 7; unsigned char y = tmp >> 7; printf("%x\n", y); // 1...

33得票4回答
每个整数在此方程中都被提升为双精度浮点数吗?

一个浮点数据类型(例如double)的存在是否确保所有的+、-、*、/、%等数学运算都假定使用双操作数? 如果情况比这更复杂,是否有一些资源可以描述这些规则?我是否不应该问这样的问题,并且总是将int明确转换为double,当方程的结果是double时。以下是我正在考虑的一些方程。我故意没有...

32得票1回答
为什么这个函数调用存在二义性?

我正在阅读标准并试图弄清楚为什么这段代码不会在没有转换的情况下被解析。void foo(char c) { } // Way bigger than char void foo(unsigned long int) { } int main() { foo(123456789); /...

31得票2回答
位移和整数提升?

C语言通常要求将二元运算符的操作数提升为更高级别操作数的类型。这可以被利用来避免在代码中填充冗长的转换,例如:if (x-48U<10) ... y = x+0ULL << 40; 然而,我发现至少对于gcc编译器来说,这种行为在位移操作时并不适用。例如:int x = 1;...

30得票3回答
当二进制运算符两侧的有符号性不同时,促销规则是如何工作的?

考虑以下程序:// http://ideone.com/4I0dT #include <limits> #include <iostream> int main() { int max = std::numeric_limits<int>::max...

28得票1回答
奇怪的位移行为

我有以下工作正常的 C 代码:int ex(unsigned int x) { int mask = 0x55555555; int a = ((x >> 0) & mask ); return a + ((x >> 1) & ...

27得票4回答
为什么在C语言中进行加法运算时会提升整数类型?

所以我们遇到了一个现场问题,在经过数天的调试后,将问题缩小到了这段代码的特定位,其中while循环中的处理没有发生:// heavily redacted code // numberA and numberB are both of uint16_t // Important stuff h...