Tag: 整数提升

在C表达式中发生整数溢出时会发生什么?

我有以下C代码: uint8_t firstValue = 111; uint8_t secondValue = 145; uint16_t temp = firstValue + secondValue; if (temp > 0xFF) { return true; } return false; 这是替代实现: uint8_t firstValue = 111; uint8_t secondValue = 145; if (firstValue + secondValue > 0xFF) { return true; } return false; 第一个例子很明显, uint16_t类型足以包含结果。 当我在OS / X上使用clang编译器尝试第二个示例时,它正确返回true。 那里发生了什么? 是否有某种临时的 ,更大的类型来包含结果?

一元+/-运算符怎么可能在“-a”或“+ a”中引起整数提升,’a’是算术数据类型常量/变量?

这看似微不足道的一行来自C书我的Mike Banahan&Brady (第2.8.8.2节) 。 我可以理解隐式促销如何在c=a+b这样的表达式中发挥作用,具体取决于操作数的类型,但我无法理解如何以及在何种情况下同样可以在-b ,其中b是任何合法的操作数。 你能解释一下然后给出一个恰当的例子吗? 提取的文字如下: 通常的算术转换应用于运算符的二进制forms的两个操作数。 仅对运算符的一元forms的操作数执行整体促销。 更新: 为了避免被忽视,我在这里根据OUAH在评论中的回答添加了我所要求的内容 – 书中说“ Only the integral promotions are performed ”…这是否意味着在x=-y ,其中’x’这样的表达式中’是一个长双,’y’是一个浮点数,如果我们明确使用一元运算符,’y’将不会被提升为long double? 我知道会这样,但要求它更清楚地了解“只有整体促销……”部分。 更新: 你能举例说明促销是如何为以下逐位运算符发挥作用的吗? 对于最后三个,我应该假设每当在变量上使用它时,它首先被提升为整数类型吗? 那么“通常的算术转换”究竟对前三个意味着什么呢? 你能举一个小例子吗? 如果可以在这里解决,我不想将其作为单独的问题发布。

make plain int 64 bit会破坏很多合理的代码吗?

直到最近,我还是考虑过大多数系统实现者/供应商的决定,即使在64位机器上也能保持32位,这是一种权宜之计。 对于现代C99固定大小类型( int32_t和uint32_t等),需要有一个标准整数类型,每个大小8,16,32和64大多消失,似乎int也可以做64位。 但是,C中plain int大小的最大实际结果来自于C本质上没有小于int类型的算术。 特别是,如果int大于32位,则对uint32_t值的任何算术的结果都具有signed int类型,这相当令人不安。 这是否是在实际实现int永久固定为32位的一个很好的理由? 我倾向于说是的。 在我看来,当int大于32位时, uint32_t可能会有大量使用。 除非你回到uint32_t否则即使应用一元减号或按位补码运算符也会变得危险。 当然,同样的问题适用于当前实现的uint16_t和uint8_t ,但是每个人似乎都知道并习惯将它们视为“小于int ”类型。

无符号和较大签名类型之间隐式转换的不一致行为

请考虑以下示例: #include int main(void) { unsigned char a = 15; /* one byte */ unsigned short b = 15; /* two bytes */ unsigned int c = 15; /* four bytes */ long x = -a; /* eight bytes */ printf(“%ld\n”, x); x = -b; printf(“%ld\n”, x); x = -c; printf(“%ld\n”, x); return 0; } […]

C中的常用算术转换:这个特定规则背后的基本原理是什么

来自k&R C. 首先,如果任一操作数是long double,则另一个操作数转换为long double。 否则,如果任一操作数为double,则另一个操作数转换为double。 否则,如果任一操作数是浮点数,则另一个操作数转换为浮点数。 否则,对两个操作数执行整体促销 ; … 这意味着低于表达 char a,b,c; c=a+b; 实际上是计算为 c = char((int)a+(int)b); 这条规则背后的理由是什么? 如果a,b和c很短,是否会发生这些转换?

整体推广

什么时候有符号整数不能代表整数提升的原始类型的所有值? 来自文本K&R,C Programming Language,2nd Ed。 页。 174 A.6.1整体推广 无论是否有符号,都可以使用字符,短整数或整数位字段,或者枚举类型的对象,可以在任何可以使用整数的表达式中使用。 如果int可以表示原始类型的所有值,则该值将转换为int; 否则该值将转换为unsigned int 。 此过程称为整体促销。 此代码显示了我的系统类型的限制: #include #include int main(void) { printf(“CHAR_MAX: %i\n”, CHAR_MAX); printf(“UCHAR_MAX: %i\n”, UCHAR_MAX); printf(“SHORT_MAX: %i\n”, SHRT_MAX); printf(“USHORT_MAX: %i\n”, USHRT_MAX); printf(“INT_MAX: %i\n”, INT_MAX); printf(“UINT_MAX: %u\n”, UINT_MAX); return 0; } 结果是: CHAR_MAX: 127 UCHAR_MAX: 255 SHORT_MAX: 32767 USHORT_MAX: 65535 INT_MAX: 2147483647 UINT_MAX: 4294967295 signed […]

整数推广 – 步骤是什么

此代码打印B2 short a=-5; unsigned short b=-5u; if(a==b) printf(“A1”); else printf(“B2”); 我读到有关整数提升的内容,但我仍然不清楚,这里的例子是如何工作的? 有人可以在扩大/截断值时彻底发布编译器遵循的步骤吗?

C中的类型推广

我对以下代码感到困惑: #include #include int main(int argc, char ** argv) { uint16_t a = 413; uint16_t b = 64948; fprintf(stdout, “%u\n”, (a – b)); fprintf(stdout, “%u\n”, ((uint16_t) (a – b))); return 0; } 返回: $ gcc -Wall test.c -o test $ ./test 4294902761 1001 $ 似乎表达式(a-b)具有类型uint32_t。 我不明白为什么因为两个运算符都是uint16_t。 任何人都可以向我解释这个吗?

一元+运算符会进行类型转换吗?

直到现在我才相信没有使用一元+算子。 但后来我遇到了以下例子: char ch; short sh; int i; printf(“%d %d %d”,sizeof(ch),sizeof(sh),sizeof(i)); // output: 1 2 4 printf(“%d %d %d”,sizeof(+ch),sizeof(+sh),sizeof(i)); // output: 4 4 4 这是否意味着+正在进行类型转换? 因为它的行为与以下相同 printf(“%d %d %d”,sizeof((int)ch),sizeof((int)sh),sizeof(i)); // output: 4 4 4 这迫使我认为+正在进行类型转换。 但后来我尝试double double f; printf(“%d %d”,sizeof(+f),sizeof((int)f),sizeof(f)); // output: 8 4 8 这迫使我重新考虑一元+算子。 所以我的第二个问题是:一元+运算符在sizeof运算符中有特殊效果吗?

如何在C中评估换档操作符?

当我使用shift >> <<进行操作时,我最近发现了一个(奇怪的)行为! 为了解释它,让我编写这个小的可运行代码,执行两个应该是相同的操作(在我的理解中),但我对不同的结果感到惊讶! #include int main(void) { unsigned char a=0x05, b=0x05; // first operation a = ((a<>7); // second operation b <>= 7; printf(“a=%X b=%X\n”, a, b); return 0; } 运行时, a = 5 , b = 1 。 我希望它们都等于1! 有人可以解释为什么我得到这样的结果? PS:在我的环境中, unsigned char的大小是1个字节