Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.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中的值范围_C_Variables_Range - Fatal编程技术网

C中的值范围

C中的值范围,c,variables,range,C,Variables,Range,我在python中从未遇到过这样的变量类型(尽管我还是python的初学者,刚刚开始学习C) 我在C中遇到过变量类型,在给出值的范围时感到困惑,就像我做了以下推导一样: 存储大小是特定类型的变量可以容纳的空间量。但关于价值范围,我有很多疑问: 我认为数值范围是我们可以输入特定变量的整数: 示例: 我认为有符号字符的存储大小是1字节,我们不能输入variable1=128,但我在编译这个简单程序时错了 #include <stdio.h> int main(void) { si

我在python中从未遇到过这样的变量类型(尽管我还是python的初学者,刚刚开始学习C)

我在C中遇到过变量类型,在给出值的范围时感到困惑,就像我做了以下推导一样:

  • 存储大小是特定类型的变量可以容纳的空间量。但关于价值范围,我有很多疑问:

  • 我认为数值范围是我们可以输入特定变量的整数:

示例:

我认为有符号字符的存储大小是1字节,我们不能输入variable1=128,但我在编译这个简单程序时错了

#include <stdio.h>
int main(void)
{
  signed char variable1;
  variable1 = 128;
  printf("the value is: %d", variable1);
  return 0;
}  
The output of the compiler(using dev C++) was :  
  -127  
#包括
内部主(空)
{
有符号字符变量1;
变量1=128;
printf(“值为:%d”,变量1);
返回0;
}  
编译器的输出(使用dev C++)为:
-127  
所以我认为一旦它超过它的范围,它会从最小值开始,在255之后产生一个错误,我是对的。从-32768到32767的short int类型也是如此。但是,对于int-2147483648到2147483647类型,此操作失败。它继续带着口音

因此,我对价值范围的全部看法都没有了。这可能比我想象的更复杂。那么变量的取值范围是什么,我们如何解释所有这些奇怪的结果呢

编辑1:我编辑以上载我的实验:


我认为,在补码编码中(现在不是很常见,但在过去是),+0和-0有单独的值,因此8位量的范围是-127到+127

但是在有两个补码表示的处理器中(这相当常见),在C语言和C++语言中,最小值几乎肯定是-128。之所以保证只使用-127,是因为它允许支持非2的补码表示

这是因为二的补码编码的工作方式:0被视为一个“正数”(有符号的位),因此,可用的正数减少了一个

您可以找到以常量形式进入char类的范围值。这可能返回系统支持的准确范围

谢谢

“C中的值范围”是一个广泛的主题。就整数范围而言,1位整数字段可能具有0到1或(-1到0)的窄范围
intmax\u t/uintmax\u t
处理64位或更大范围内的数字。C中的许多整数类型的范围限制和转换是一个棘手的问题


关注OP的例子:
在下面的示例中,
128
是一个整数常量,值为128,类型为
int

signed char variable1;
variable1 = 128;
signed char
的范围是
SCHAR\u MIN
SCHAR\u MAX
。这通常是-128到127,可以小到-127到127。(见C11§5.2.4.2.1)

作业需要将
int
转换为
signed char
,以下内容适用于假定的
signed char
范围:(我的重点)

当整数类型的值转换为除
\u Bool
以外的其他整数类型时,如果该值可以用新类型表示,则该值不变。C11dr§6.3.1.3 1

否则,新类型是有符号的,并且不能在其中表示值结果是执行定义的,或者发出执行定义的信号。C11dr§6.3.1.3 3

一个典型的实现定义的结果是2的补码环绕,因此-128的值是常见的。OP的平台做了一些不同的事情,给了它-127的值。它是实现定义的行为



不确定“编译器的输出(使用devc++)是:-127”意味着OP正确使用了C编译器。OP应该确保。

返回的值是-127,因为发生了溢出。欢迎使用
stackOverflow
:)我认为有符号整数类型中的-128溢出会导致未定义的行为。例如,与Python不同,C假定您了解计算机。有符号字节的最大值在C程序中与在CPU指令集中相同。CPU极有可能使用2的补码格式,这意味着一个字节的值可以从-128到+127。要完全理解这些内容,首先需要学习二进制数格式。事实证明,这是学习编程之前必须具备的先决知识。“参见C11§5.2.4.2.1 1”,这是什么?@chux,你的意思是-128是两个补码的结果吗?我们怎么能用二的补码来得到这个结果呢?@chux,在int类型中,输入值2147438648并不能得到结果-2147438648,我不理解这一点point@BumbleBee“平均值-128是二的补码的结果?”-->是的。我们不使用2的补码来得到这个-这是另一种方式。我们使用
SCHAR\u MIN-->-128
来推断实现选择了使用8位2的补码-这是一个非常常见的选择。@chux,为什么不像我上面指出的那样为int类型做这个选择?