我们知道 char 变量的范围是从 -128 到 127,最大值是 255(对于 unsigned char)。请澄清我的以下疑问:
char c=255;既然超出了范围,为什么它会结束 255 而不是给出错误?
为什么没有负 char 值(-128 到 -1)的 ascii 值?例如 48-57 代表 0-9(字符值)
当我们int x=4*1024*1024*1024;这样做时,它会给出溢出错误,但是,当我们int x=4 * 1024; x*=(1024*1024);这样做时(编译器)不会给出错误,而是会进行包装。为什么?
\n\n我们知道 char 变量的范围是从 -128 到 127,最大值是 255(对于 unsigned char)
\n
C 标准要求 的范围unsigned char至少为 0 到 255。您可以使用更大范围的 C 实现unsigned char,使其超过 8 位。
char可以是有符号的(范围至少为 \xe2\x88\x92127 到 +127)或无符号。
\n\n1.)char c=255;// 由于超出了范围,为什么它会包裹 255 而不是给出错误?
\n
C 标准中的规则是,如果 255char超出 的范围,则 255 将以实现定义的方式转换为 的类型char。因此每个 C 实现都可以定义自己的转换规则。
编译器可以超越 C 标准并为此发出警告。如果您在编译器中启用其他警告,它可能会这样做。
\n\n\n2.)为什么没有负char值**(-128到-1)**的ascii值?比如 48-57 代表 0-9(字符值)
\n
这就像问为什么我的购物清单上只有七样东西一样。没有更多了,因为我没有在清单上添加更多内容。ASCII 委员会只定义了代码 0 到 127 的字符。ASCII 中没有更多的代码,因为委员会没有定义更多的代码。他们正在努力将字符装入七位,留下第八位(常见的八字节)用于奇偶校验或其他目的。
\n\n\n3.)当我们执行 int x=4102410241024 时;它给出了溢出错误,但是,当我们这样做时 int x=4 * 1024; x=(1024*1024); 它(编译器)不会给出错误,而是会进行包装。为什么?
\n
当询问错误消息时,您应该给出错误消息的确切文本。我不知道您的编译器给您提供了哪个 \xe2\x80\x9coverflow error\xe2\x80\x9d ,但它可能会警告您右操作数大于左操作数可以表示的类型。对于常量,编译器很容易发现该值太大并给出警告。对于涉及运算符的表达式,编译器需要做更多的工作才能看到结果太大并给您发出警告。如果在编译时计算表达式的值不太困难,一些编译器会这样做。
\nC 标准没有定义溢出操作的结果。诸如上述的转换需要由实现定义,但如果您执行溢出的乘法,则不需要实现来定义行为。某些 C 实现可能会定义要换行的算术,但并不要求它们这样做。
\n