算术表达式在C中输入涉及常量的类型

时间:2013-10-10 07:13:50

标签: c casting constants bit-manipulation

如果我写的东西像1&lt;&lt; 8;什么是默认类型。 它是无符号的还是默认签名的,或者我必须输入它? 基本上我的问题是: 在C中涉及常数(正)的表达式的类型是什么(例如2 <&lt; 13)? 每次我们需要对它进行类型转换吗?

如果我想使用它(1 <&lt; 8),因为签名的类型转换是强制性的? 像short int x =(signed)(1&lt;&lt; 8);

3 个答案:

答案 0 :(得分:5)

结果的类型与提升的左操作数的类型相同。 默认的整数签名已签名,因此默认情况下会对您的结果进行签名。

答案 1 :(得分:1)

1)char有8位。你必须使1&lt;&lt; 7才能设置第一位。

2)如果值是否有符号无关紧要,则位是相同的。 “=”左侧的数据类型决定值是否有符号。

您可以尝试以下示例: 我不得不换31次,因为我的值自动调用为int。

#include <stdio.h>
int main() {
   printf("size of int in Bytes: %d \n",sizeof(int)); //4
   printf("my number: %d \n",1<<31); //-2147483648
   printf("my number: %u \n",1<<31); //2147483648
   return 0;
}

也许你可以研究这个来理解%d和%u:printf reference

答案 2 :(得分:0)

1 << 8的结果类型为int,但如果1的值较大,则可能会有不同的类型。

如果源代码的十进制数字没有后缀,则其类型是可以表示该值的intlong intlong long int中的第一个。因为这些类型的大小在不同的C实现中可能不同,所以数字的类型在不同的C实现中可以不同。例如,65536在一个C实现中可能是int,在另一个C实现中可能是long int

按位移位的结果具有(提升的)左操作数的类型。 (此处的促销不相关,因为每个整数文字已经是其促销产生的类型。但是,如果您有char x;,那么x在表达式中使用时将受到促销。)

因此,1 << 8的类型为int

类型,促销和按位移动的相互作用可能很麻烦。新手程序员可以使用1 << 31来获取第31位设置的值。但是,在许多C实现中,此表达式具有未定义的行为,因为理想的数学结果2 31 int为32的实现中不能表示为int位。操作溢出,C标准没有定义行为。

出于这个原因,通常使用带有按位移位运算符和按位逻辑运算符的无符号值。 <{1}}取代1 << 31,而不是1u << 31

unsigned char x; … x << 24中出现了一个特别令人讨厌的问题。在这里,程序员认为他们通过使用无符号类型进行位操作已经做了正确的事情。不幸的是,整数提升规则(在正常的C实现中)将unsigned char转换为int,而不是转换为unsigned int。因此,在x << 24中,x变为有符号整数,并且移位可能会溢出,从而导致未定义的行为。

因此,任何使用按位运算的程序员都必须学习C 2011(N1570)6.3.1.1 2和6.3.1.8中的C标准中记录的整数提升规则和通常的算术转换。 / p>