标签: integer-promotion

类型转换 - unsigned to signed int/char

我试过执行以下程序:

#include <stdio.h>

int main() {
    signed char a = -5;
    unsigned char b = -5;
    int c = -5;
    unsigned int d = -5;

    if (a == b)
        printf("\r\n char is SAME!!!");
    else
        printf("\r\n char is DIFF!!!");

    if (c == d)
        printf("\r\n int is SAME!!!");
    else
        printf("\r\n int is DIFF!!!");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

对于这个程序,我得到输出:

char是DIFF !!! int是相同的!

为什么我们两者都有不同的输出?
输出应该如下?

char是相同的!int是相同的!

一个键盘连接.

c types type-conversion integer-promotion signedness

73
推荐指数
4
解决办法
3万
查看次数

为什么在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
查看次数

为什么 'char -&gt; int' 是提升,而 'char -&gt; Short' 是转换(而不是提升)?

我读过cppreference.com 的隐式转换

整数提升:
小整数类型(例如 char)的纯右值可以转换为较大整数类型(例如 int)的纯右值。

[...]

请注意,所有其他转化均不属于促销;例如,重载决策选择 char -> int (提升)而不是 char -> Short (转换)。

从charint的转换就是‘提升’;很清楚(从1字节到4字节)。
从 char -> Short 的转换是“不提升”;为什么?
我一直认为char是一个字节,short(short int)是两个字节。为什么它不被视为促销?这似乎与第一行相矛盾。难道‘小改大’就是升职吗?)


寻找一些答案后:

我们可以考虑“促销是转化的特例”吗?我们是否可以说“所有促销都是转化,但并非所有转化都是促销”?
或者我们应该将它们视为两个不同且独立的概念?

c++ type-conversion integer-promotion language-lawyer

41
推荐指数
3
解决办法
3450
查看次数

为什么在一个表达式中同时使用左移和右移会有所不同?

我有以下代码:

unsigned char x = 255;
printf("%x\n", x); // ff

unsigned char tmp = x << 7;
unsigned char y = tmp >> 7;
printf("%x\n", y); // 1

unsigned char z = (x << 7) >> 7;
printf("%x\n", z); // ff
Run Code Online (Sandbox Code Playgroud)

我会期望y并且z是一样的。但它们因是否使用中间变量而异。知道为什么会这样会很有趣。

c operators bit-shift integer-promotion language-lawyer

39
推荐指数
3
解决办法
1202
查看次数

为什么这个函数调用不明确?

我正在阅读标准并试图弄清楚为什么没有演员表就无法解决此代码.

void foo(char c) { }

// Way bigger than char
void foo(unsigned long int) { }

int main()
{
   foo(123456789); // ambiguous
   foo((unsigned long int) 123456789); // works
}
Run Code Online (Sandbox Code Playgroud)

这就是它所说的:

4.13整数转换排名[conv.rank]

每个整数类型都有一个整数转换等级,定义如下:

- 任何无符号整数类型的等级应等于相应有符号整数类型的等级.

- char的等级应等于signed char和unsigned char的等级.

特别是,我的jimmies的沙沙声是它没有说任何无符号整数类型,只是unsigned char.我的猜测是,char通过转换被提升为无符号类型.这是真的?

c++ integer integer-promotion implicit-conversion unsigned-integer

32
推荐指数
1
解决办法
1959
查看次数

Bitshift和整数推广?

通常,C要求将二元运算符的操作数提升为更高级别操作数的类型.这可以被利用来避免用详细的强制转换填充代码,例如:

if (x-48U<10) ...
y = x+0ULL << 40;
Run Code Online (Sandbox Code Playgroud)

等等

但是,我发现,至少对于gcc,这种行为不适用于位移.即

int x = 1;
unsigned long long y = x << 32ULL;
Run Code Online (Sandbox Code Playgroud)

我希望右手操作数的类型可以促使左手操作数被提升,unsigned long long以便移位成功.但相反,gcc会打印一个警告:

warning: left shift count >= width of type
Run Code Online (Sandbox Code Playgroud)

gcc是否被破坏,或标准是否对位移的类型提升规则有所例外?

c standards gcc bit-manipulation integer-promotion

28
推荐指数
1
解决办法
5272
查看次数

奇数位移位行为

我有以下C代码工作:

int ex(unsigned int x) {
    int mask  = 0x55555555;
    int a = ((x >> 0) & mask );
    return a + ((x >> 1) & mask );
}
Run Code Online (Sandbox Code Playgroud)

但是,当我将其扩展到此时,我得到了不同的结果:

int ex(unsigned int x) {
    int mask  = 0x55555555;
    int a = ((x >> 0) & mask );
    int b = ((x >> 1) & mask );
    return a + b;
}
Run Code Online (Sandbox Code Playgroud)

造成这种差异的原因是什么?

编辑:注意,我正在为32位编译.

c integer-promotion implicit-conversion

28
推荐指数
1
解决办法
1490
查看次数

为什么在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
}
Run Code Online (Sandbox Code Playgroud)

这个运行得很好,直到我们达到了65535的uint16限制.另一堆打印语句后来,我们发现它numberA + 1有一个值65536,同时被numberB包裹回来0.检查失败,没有进行任何处理.

这让我很好奇,所以我整理了一个快速的C程序(用GCC 4.9.2编译)来检查:

#include <stdio.h>
#include <stdint.h>

int main()
{

    uint16_t numberA, numberB;
    numberA = 65535;
    numberB = numberA + 1;

    uint32_t numberC, numberD;
    numberC = 4294967295;
    numberD = numberC + 1;

    printf("numberA = %d\n", numberA …
Run Code Online (Sandbox Code Playgroud)

c integer-promotion

26
推荐指数
2
解决办法
2338
查看次数

在一个C表达式中,unsigned int和signed int存在,哪种类型将被提升为什么类型?

我有一个关于C语言标准中的数据类型提升规则的查询.C99说:

C整数提升还要求"如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int".

我的问题是在C语言表达式的位置unsigned intsigned int存在的情况下,哪种类型将被提升为什么类型?

例如int,不能代表unsigned int(值大于MAX_INT值)的所有值,而unsigned int不能代表-ve值,那么在这种情况下什么类型被提升为什么?

c integer-promotion

25
推荐指数
2
解决办法
3万
查看次数

面试问题中这个位操作代码有什么问题?

我正在查看此页面:http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp,并且不明白这个问题:

以下代码可能有什么问题?

long value;
//some stuff
value &= 0xFFFF;
Run Code Online (Sandbox Code Playgroud)

注意:向候选人提供有关他们正在开发的基础平台的提示.如果该人仍然没有发现代码有任何问题,他们就没有C++经验.

有人可以详细说明吗?

谢谢!

c c++ bit-manipulation integer-promotion

25
推荐指数
1
解决办法
2809
查看次数