我试过执行以下程序:
#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++继承了这一要求,对于转换short成int从C.执行算术运算时,我可以挑你的大脑,以为什么这是用C首先介绍?为什么不做这些操作short呢?
例如(取自评论中的dyp建议):
short s = 1, t = 2 ;
auto x = s + t ;
Run Code Online (Sandbox Code Playgroud)
x将具有int类型.
整数提升:
小整数类型(例如 char)的纯右值可以转换为较大整数类型(例如 int)的纯右值。[...]
请注意,所有其他转化均不属于促销;例如,重载决策选择 char -> int (提升)而不是 char -> Short (转换)。
从char到int的转换就是‘提升’;很清楚(从1字节到4字节)。
从 char -> Short 的转换是“不提升”;为什么?
我一直认为char是一个字节,short(short int)是两个字节。为什么它不被视为促销?这似乎与第一行相矛盾。难道‘小改大’就是升职吗?)
寻找一些答案后:
我们可以考虑“促销是转化的特例”吗?我们是否可以说“所有促销都是转化,但并非所有转化都是促销”?
或者我们应该将它们视为两个不同且独立的概念?
我有以下代码:
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是一样的。但它们因是否使用中间变量而异。知道为什么会这样会很有趣。
我正在阅读标准并试图弄清楚为什么没有演员表就无法解决此代码.
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
通常,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代码工作:
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位编译.
所以我们遇到了一个字段问题,经过几天的调试后,将问题缩小到这个特定的代码位,其中没有发生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语言标准中的数据类型提升规则的查询.C99说:
C整数提升还要求"如果int可以表示原始类型的所有值,则该值将转换为int;否则,它将转换为unsigned int".
我的问题是在C语言表达式的位置unsigned int和signed int存在的情况下,哪种类型将被提升为什么类型?
例如int,不能代表unsigned int(值大于MAX_INT值)的所有值,而unsigned int不能代表-ve值,那么在这种情况下什么类型被提升为什么?
我正在查看此页面:http://www.devbistro.com/tech-interview-questions/Cplusplus.jsp,并且不明白这个问题:
以下代码可能有什么问题?
Run Code Online (Sandbox Code Playgroud)long value; //some stuff value &= 0xFFFF;注意:向候选人提供有关他们正在开发的基础平台的提示.如果该人仍然没有发现代码有任何问题,他们就没有C++经验.
有人可以详细说明吗?
谢谢!