Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 切换数据类型int的第100位会产生意外的结果_C_Gcc_Int_Bit Manipulation_Toggle - Fatal编程技术网

C 切换数据类型int的第100位会产生意外的结果

C 切换数据类型int的第100位会产生意外的结果,c,gcc,int,bit-manipulation,toggle,C,Gcc,Int,Bit Manipulation,Toggle,下面的代码只要求输入一个数字num,然后输入该数字的位tbit,以切换/反转,然后打印新的数字ans 使用Geany on debian 9,使用gcc编译器版本6.3.0 20170516,当我执行以下代码时,我得到了一个答案ansof 6,当我期望编译器或运行时出错时,告诉我我超出了界限或什么 使用此版本的gcc,sizeof(int)返回四个字节或32位。当我尝试切换第100位时,发生了什么事情使得ans=6 输入示例: Enter a number : 22 Enter the bit

下面的代码只要求输入一个数字
num
,然后输入该数字的位
tbit
,以切换/反转,然后打印新的数字
ans

使用Geany on debian 9,使用gcc编译器版本6.3.0 20170516,当我执行以下代码时,我得到了一个答案
ans
of 6,当我期望编译器或运行时出错时,告诉我我超出了界限或什么

使用此版本的gcc,
sizeof(int)
返回四个字节或32位。当我尝试切换第100位时,发生了什么事情使得ans=6

输入示例:

Enter a number : 22
Enter the bit you want to toggle : 100
输出:

The number you entered is 22
after toggling the 100 bit
the new number is 6.`
代码:

#include <stdio.h>

int main ()
{
 int num, tbit, tool = 1, ans; 

printf(Enter a number :"); 
scanf("%d", &num); 

printf(Enter the bit you want to toggle :");
scanf("%d", &tbit);

ans = (tool<<tbit) ^ num; 

printf("The number you entered is %d after toggling the %d bit the new 
number is %d\n" , num, tbit, ans);

return 0;
}
#包括
int main()
{
int num,tbit,tool=1,ans;
printf(输入一个数字:);
scanf(“%d”和&num);
printf(输入要切换的位:);
scanf(“%d”和&tbit);

ans=(工具C没有“运行时错误”这样的东西。在表达式
xC中没有“运行时错误”这样的东西。在表达式
x中,根据C语言标准,行为是未定义的:

6.5.7.3:如果右操作数的值为负值或为 大于或等于提升的左操作数的宽度,行为未定义

每种特定情况下发生的情况都与硬件有关,因此任何依赖于它的程序都是无效的。在您的情况下,硬件似乎会截断
tbit
的高位,就好像代码如下所示:

ans = (tool<< (tbit & 0x1F)) ^ num; 

ans=(工具根据C语言标准,行为未定义:

6.5.7.3:如果右操作数的值为负值或为 大于或等于提升的左操作数的宽度,行为未定义

每种特定情况下发生的情况都与硬件有关,因此任何依赖于它的程序都是无效的。在您的情况下,硬件似乎会截断
tbit
的高位,就好像代码如下所示:

ans = (tool<< (tbit & 0x1F)) ^ num; 

ans=(工具为什么要切换没有100位的数据类型的第100位?听起来有问题。@cleblanc:我猜OP只是在重新键入代码时出错,因为输出似乎表明
scanf
是正确的。@ChristianGibbons只是想看看会发生什么。你不应该依赖奇怪的实验就像那样。C中有许多未定义行为的例子,因此,虽然您的实验可能会显示一个结果,但另一个系统或另一次运行可能会产生另一个结果。如果您有兴趣了解更多有关如何工作的信息,我建议您在某个时间看看C标准“原始帖子或原始海报取决于上下文……他在谈论你。你为什么试图切换没有100位的数据类型的第100位?这听起来有问题。@cleblanc:我猜OP只是在重新键入代码时出错了,因为输出似乎表明
scanf
是正确的。@ChristianG”IBBON只是想看看会发生什么。你不应该依赖这样奇怪的实验。C中有许多未定义行为的例子,因此,虽然你的实验可能会显示一个结果,但另一个系统或另一次运行可能会产生另一个结果。如果你对学习m感兴趣,我建议你花点时间看看C标准关于事物是如何运作的原始帖子或原始海报是否取决于上下文…他在谈论你。你能引用你的答案吗?你能引用你的答案吗?在关于C的问题中,x86 CPU上的注释可能会产生误导,因为它不需要反映编译器如何在x86上实现转换的任何内容。在某些情况下,
@R这只是“事后合理化”OP正在观察的行为。甚至Intel的手册也说结果是未定义的,这可能是因为他们不希望在将来从事任何特定的行为:显然,他们确切地知道他们的CPU对寄存器的高位做了什么。x86 ISA行为绝对不是未定义的;事实上编译器使用它优化。例如,请参见x86 CPU上的注释,在一个关于C的问题中可能会产生误导,因为它不需要反映编译器如何在x86上实现转换的任何内容。在某些情况下,
@ROP正在观察的行为。甚至Intel的手册也说结果是未定义的,这可能是因为他们不希望在将来从事任何特定的行为:显然,他们确切地知道他们的CPU对寄存器的高位做了什么。x86 ISA行为绝对不是未定义的;事实上编译器使用它要优化,请参见示例