Tag: 整数提升

将int截断为char – 是否已定义?

unsigned char a, b; b = something(); a = ~b; 静态分析器抱怨最后一行中的截断,可能是因为b在其位被翻转之前被提升为int,结果将是int类型。 我只对提升的int的最后一个字节感兴趣 – 如果b是0x55,我需要a为0xAA。 我的问题是, C规范是否说明截断发生的方式 ,还是实现定义/未定义? 是否可以保证a总是被赋予我期望的值或者在符合标准的平台上出错? 当然,在分配之前投射结果会使静态分析器静音,但我想知道首先忽略此警告是否安全。

“通常的算术转换”和“整数促销”是一回事吗?

“通常的算术转换”和“整数促销”是一回事吗? 我读过“通常的算术转换”用于使表达式的操作数具有相同的类型,而“整数提升”用于将小于int的类型提升为int ,但在MSDN中 ,这两个概念都放在“通常的算术转换”只。

unsigned char总是被提升为int吗?

假设如下: unsigned char foo = 3; unsigned char bar = 5; unsigned int shmoo = foo + bar; 是否保证将foo和bar值提升为用于表达式foo + bar的求值的int值 – 或者是否允许实现将它们提升为unsigned int ? 在第6.2.5节第8段中: 对于具有相同签名和不同整数转换等级的任何两个整数类型(参见6.3.1.1),具有较小整数转换等级的类型的值范围是另一种类型的值的子范围。 在第6.2.5节第9段中: 如果int可以表示原始类型的所有值,则该值将转换为int ; 否则,它将转换为unsigned int 。 保证具有较小整数转换等级的整数类型具有作为另一类型的值的子范围的值的范围似乎取决于整数类型的有符号性。 signed char对应于signed int unsigned char对应unsigned int 这是否意味着unsigned char值只能保证在unsigned int的子范围内,而不一定是int ? 如果是这样,那是否意味着实现理论上可以有一个unsigned char值,它不在int的子范围内?

char是默认提升的吗?

这可能是个愚蠢的问题,但有人可以为C ++ 11和C11提供标准参考: char是否默认提升为int ? 这里有一点背景:C和C ++都有默认参数提升的概念(C ++ 11:5.2.2 / 7; C11:6.5.2.2/6)。 这需要在以下调用中提升参数: void f(int, …); float a = 1; short int b = 2; char c = ‘x’; f(0, a, b, c); 对于函数调用, a转换为double , b转换为int 。 但是c会发生什么? 我一直认为char也被提升为int ,但我无法在标准中找到相关的陈述。

为什么在C中添加时会提升整数类型?

所以我们遇到了一个字段问题,经过几天的调试后,将问题缩小到这个特定的代码位,其中没有发生while循环中的处理: // heavily redacted code // numberA and numberB are both of uint16_t // Important stuff happens in that while loop while ( numberA + 1 == numberB ) { // some processing } 这个运行正常,直到我们达到了65535的uint16限制。稍后的另一堆打印语句,我们发现numberA + 1的值为65536 ,而numberB包装回0 。 检查失败,没有进行任何处理。 这让我很好奇,所以我整理了一个快速的C程序(用GCC 4.9.2编译)来检查: #include #include int main() { uint16_t numberA, numberB; numberA = 65535; numberB = […]

算术运算期间的数据类型提升:-1 <(unsinged int)1 == false

main() { if ( -1 < (unsigned char) 1 ) printf("less than"); else printf("NOT less than"); } 打印less than 。 因为, (unsigned char) 1 被转换为 (signed char) 1然后:( (signed) -1 < (signed) 1 ,因此输出less than 。 但是,如果我将上面的代码更改为if ( (-1 < (unsigned int) 1 ) 然后输出NOT less than 。 所以很明显,当我将unsigned char更改为unsigned int时: (signed)-1转换为unsigned int [正好相反] 因为-1被存储为2的恭维1; […]

与运营商<<的整数推广

类似于Bitshift和整数提升的问题? ,我在使用左位移时有一个关于整数提升的问题。 unsigned int test(void) { unsigned char value8; unsigned int result; value8 = 0x12; result = value8 << 8; return result; } 在这种情况下,value8首先会提升为unsiged int还是具体实现? 6.5.7按位移位运算符… 3 Sematics … 对每个操作数执行整数提升。 结果的类型是提升的左操作数的类型。 如果右操作数的值为负或大于或等于提升的左操作数的宽度,则行为未定义。 它说“整数促销是在每个操作数上执行的”。 ,但这里的推广规则是什么? 我假设它应该convert to int if lesser rank than int ,但我找不到它。 我问这个,因为一个编译器(Renesas nc30wa)没有提升到int,所以我的样本结果总是0。 在这个平台上,char是8位宽,int 16位。

为什么组合uint8_t的两个class次产生不同的结果?

有人可以解释一下原因: x = x <> 1; 和: x = (x <> 1; 在C中产生不同的答案? x是* uint8_t *类型(无符号1字节长整数)。 例如,当我在第一种情况下将其传递128 (10000000) ,它返回0 (正如预期的那样,最高位丢失)但在第二种情况下它返回原始128 。 这是为什么? 我希望这些表达式是等价的吗?

尤达条件和整数推广

当比较大于int的类型和整数常量时,我​​应该将常量放在左侧还是右侧以确保执行正确的比较? int64_t i = some_val; if (i == -1) 或应该是: if (-1 == i) 在任何情况下,任何一种情况都不能与-1LL (其中int64_t long long )相比吗?

Bitshift和整数推广?

通常,C要求将二元运算符的操作数提升为更高级别操作数的类型。 这可以被利用来避免用详细的强制转换来填充代码,例如: if (x-48U<10) … y = x+0ULL << 40; 等等 但是,我发现,至少对于gcc,这种行为不适用于位移。 即 int x = 1; unsigned long long y = x << 32ULL; 我希望右手操作数的类型能够将左手操作数提升为unsigned long long以便移位成功。 但相反,gcc会打印一个警告: warning: left shift count >= width of type gcc是否被破坏,或者标准是否对比特提升的类型提升规则有所例外?