相关疑难解决方法(0)

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

从我从得到的回答这个问题,看来C++继承了这一要求,对于转换shortint从C.执行算术运算时,我可以挑你的大脑,以为什么这是用C首先介绍?为什么不做这些操作short呢?

例如(取自评论中的dyp建议):

short s = 1, t = 2 ;
auto  x = s + t ;
Run Code Online (Sandbox Code Playgroud)

x将具有int类型.

c c++ int short integer-promotion

70
推荐指数
4
解决办法
8650
查看次数

无符号位字段值与有符号值的比较

在编写代码时,我在代码中观察到一件事,它与比特字段值与负整数的比较有关.

我有一个大小为1位的无符号结构成员和一个unsigned int.当我将负值与unsigned int变量进行比较时,我得到预期的结果为1但是当我将结构成员与负值进行比较时,我得到的结果相反为0.

#include <stdio.h>
struct S0
{
   unsigned int bit : 1;
};
struct S0 s;

int main (void) 
{
   int negVal = -3;
   unsigned int p = 123;
   printf ("%d\n", (negVal > p)); /*Result as 1 */
   printf ("%d\n", (negVal > s.bit));/*Result as 0 but expected 1 */
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

我怀疑的是,如果我将负值与unsigned int进行比较,那么将发生平衡(隐式类型转换).但是如果我比较unsigned int的结构成员为什么没有发生隐式类型转换.如果我错过任何基本的比特字段,请纠正我?

c bit-fields

5
推荐指数
2
解决办法
82
查看次数

c++ - 为什么在C ++中进行移位操作后,位字段的无符号整数会变成有符号整数?

测试代码:

struct A
{
    uint32_t lo : 16;
    uint32_t hi : 16;
};

int main()
{
    A a{};
    a.lo = 0xFFFF;
    auto b = a.lo << 16;
    cout << b << endl;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:-65536,类型bint但不是uint32_t

我发现,uint16_t并且uint8_t在移位运算符之后也会变成有符号整数,并且在 中有一个类似的问题C#,得出的结论是当操作数<32位时结果会变成有符号。 为什么当操作数小于 32 位时,移位操作总是产生有符号整数

但是 的类型a.lo是明确的uint32_t,可以通过 验证decltype(a.lo),那么这怎么解释呢?

c++ language-lawyer

5
推荐指数
1
解决办法
132
查看次数

标签 统计

c ×2

c++ ×2

bit-fields ×1

int ×1

integer-promotion ×1

language-lawyer ×1

short ×1