我以前一直认为这是理所当然的,但假设我有:
uint8_t a;
uint8_t b;
if ((a - b) < 0) {
...
}
Run Code Online (Sandbox Code Playgroud)
表达式的数据类型是什么(a - b)? Godbolt 先生告诉我这是一个带符号的值;这是由任何 C 规范保证的吗?
(a-b)我现在明白,当 a 和 b 小于 int 时,类型提升将保证是int 。如果 anda是bsunsigned int呢?
unsigned int a;
unsigned int b;
if ((a - b) < 0) {
...
}
Run Code Online (Sandbox Code Playgroud) void foo(void) {
unsigned int a = 6;
int b = -20;
if (a+b > a) {
printf("> a");
} else {
printf("< a");
}
}
Run Code Online (Sandbox Code Playgroud)
我试图了解上面的整数提升示例发生了什么.我知道,a = 6和b = -20输出应该是> a由于b被晋升为unsigned int.但是,< a如果我分配输出b = -5.在这种情况下输出也不应该是相同的,因为值b = -5也被提升为unsigned int?
的结果
printf("%d\n", 5.0 + 2);
是0
但
int num = 5.0 + 2;
printf("%d\n", num);
Run Code Online (Sandbox Code Playgroud)
是7
这两者有什么区别?
我正在学习 C,整数提升和降级对我来说是新的。我已经阅读了 C 标准(C17)中有关 C 类型转换和整数提升的内容,但我不知道如何识别整数提升,而且我对降级一无所知。
例如,如果我有这些代码行:
...
unsigned char x;
int y;
long int z;
int aux; //Auxiliary variable
x = 'c';
y = 1;
z = 2;
aux = x;
aux = y;
aux = z;
aux = x + y; // ZX
aux = y + z;
...
Run Code Online (Sandbox Code Playgroud)
哪里可以进行整数提升?因为据我所知,在用 注释的代码行中ZX,我有整数提升,但仅在那一行,但我不确定;你能为我澄清一下吗?
您能否举例说明何时存在降级?因为C标准没有明确。
绝对差是两个数字之间差的绝对值。假设我有 2 个int变量(x和y),我想找到绝对差。一个简单的解决方案是:
unsigned diff = abs(x-y);
Run Code Online (Sandbox Code Playgroud)
然而,如果发生溢出(例如 if xisINT_MIN和yis ) ,这些会调用未定义的行为并给出不正确的结果INT_MAX。这会返回1(假设环绕行为)而不是按UINT_MAX预期返回。
我听说转换成整数的有符号位,即
int test = INT_MAX;
test = (test<<1) + 1;
Run Code Online (Sandbox Code Playgroud)
由于测试大于INT_MAX,因此是未定义的行为.但是在签名的短变量中会遇到这种行为,即
short test1 = SHRT_MAX;
test1 = (test1<<1) + 1;
Run Code Online (Sandbox Code Playgroud)
?
目前我没有遇到任何相关文件.
编辑:我知道未定义的行为将导致整数的情况,但不是短的.
要提取无符号32位整数的高位字和低位字,并将每个字存储在单独的uint16_t变量中,我执行如下操作(nbr是无符号的32位整数):
uint16_t lower_word = (uint16_t) nbr & 0x0000FFFF; // mask desired word
uint16_t upper_word = (uint16_t) ((nbr & 0xFFFF0000) >> 16); // right-shift after masking
Run Code Online (Sandbox Code Playgroud)
显式转换为uint16_t是不必要的吗?还有什么其他更有效的方法,如果有的话,你建议获得所需的结果而不是这种方法吗?
这是两个似乎在做相同事情的代码,但事实并非如此。运行和将输出与跟踪进行比较时,这两个不同的输出产生了混淆,因为似乎第一个代码处理是与机器相关的代码。请阅读两个代码
代码1:-
unsigned char c=(((~0 << 3) >> 4) << 1);
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)
输出:-254
代码2:-
unsigned char c=(~0 << 3);
c >>= 4;
c <<= 1;
printf("%d", c);
Run Code Online (Sandbox Code Playgroud)
输出:-。30
上面代码的输出是不同的。
不仅此代码(第一个代码)引起混淆,而且涉及单行多位按位移位运算符的所有类型的代码都产生意外结果。
第二个代码执行正确。
请在您的计算机上运行此代码并验证以上输出
与/或
解释为什么这些输出不相同。
要么
最后,我们必须了解我们不应在代码中应用多个按位移位运算符。
谢谢
#include <stdio.h>
int main() {
int a;
char b;
short int c;
double d;
printf("%d %d %d %d\n", sizeof(a), sizeof(b), sizeof(c), sizeof(d));
printf("%d %d %d %d\n", sizeof(+a), sizeof(+b), sizeof(+c), sizeof(+d));
printf("%d %d %d %d\n", sizeof(-a), sizeof(-b), sizeof(-c), sizeof(-d));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
32 位编译器输出:
4 1 2 8 4 4 4 8 4 4 4 8
如果我更改 . 中的符号,输出相同sizeof(),例如sizeof(-a). 我想知道为什么会发生这种情况。+和-运算符是否在促进数据类型?
我对以下代码感到困惑:
char c = 0x66;
printf("~c = %x\n", ~c); //0xffffff99
printf("size of c: %d\n", sizeof(c)); //1 byte
printf("Size of ~c: %d\n", sizeof(~c)); //4 bytes
Run Code Online (Sandbox Code Playgroud)
Achar只有 1 个字节,但使用~运算符的结果将是 4 个字节。为什么是~c 0xffffff99而不是的结果0x99?
我犯了一些错误吗?