字节位存储的C语言编程

字节位存储的C语言编程,c,C,由于有符号字符的范围是从0到127,请从上述代码中解释如何为边界外值指定值 提前感谢。字符类型的范围取决于实现。如果是有符号类型,则其范围至少为-128到127,如果是无符号类型,则其范围至少为0到255(这些是该类型必须至少支持的范围,该类型支持的范围实际上可能大于此范围,具体取决于实现) 还要注意的是,当您将整数分配给无法保存该值的有符号类型时,您正在调用未定义的行为。因此,将128分配给不能容纳128的有符号字符(例如,当128大于char\u MAX)会调用未定义的行为。在本例中,它被包

由于有符号字符的范围是从0到127,请从上述代码中解释如何为边界外值指定值


提前感谢。

字符类型的范围取决于实现。如果是有符号类型,则其范围至少为-128到127,如果是无符号类型,则其范围至少为0到255(这些是该类型必须至少支持的范围,该类型支持的范围实际上可能大于此范围,具体取决于实现)


还要注意的是,当您将整数分配给无法保存该值的有符号类型时,您正在调用未定义的行为。因此,将128分配给不能容纳128的有符号字符(例如,当128大于
char\u MAX
)会调用未定义的行为。在本例中,它被包装为
-128
,因为它与持有128的无符号字符类型共享相同的字节表示,但与所有未定义行为的实例一样,您不能保证在所有实现中都是这样。

字符类型的范围取决于实现。如果是有符号类型,则其范围至少为-128到127,如果是无符号类型,则其范围至少为0到255(这些是该类型必须至少支持的范围,该类型支持的范围实际上可能大于此范围,具体取决于实现)


还要注意的是,当您将整数分配给无法保存该值的有符号类型时,您正在调用未定义的行为。因此,将128分配给不能容纳128的有符号字符(例如,当128大于
char\u MAX
)会调用未定义的行为。在本例中,它被包装为
-128
,因为它与持有128的无符号字符类型共享相同的字节表示,但与所有未定义行为的实例一样,您不能保证在所有实现中都会出现这种情况。

为什么有符号字符的范围是从0到127?有符号字符范围为-128到127。没有定义溢出时的行为。更具体地说,C标准中没有定义有符号溢出的行为,但定义了有符号溢出的行为。这可能与没有明确要求以2的补码形式实现有符号值的标准有关(尽管这是目前最常见的实现),为什么有符号字符的范围是0到127?有符号字符范围为-128到127。没有定义溢出时的行为。更具体地说,C标准中没有定义有符号溢出的行为,但定义了有符号溢出的行为。这可能与标准有关,该标准没有明确要求以2的补码形式实现有符号的值(尽管这是目前最常见的实现),严格地说,您错了
char
始终是1字节,但C标准没有规定一个字节必须是8位。所以你的数字——128到127并不正确(我从来没有见过CHAR_BIT!=8的平台,但是是的)。假设CHAR是8位类型最终是不安全的——某些TI DSP是一个相对较新的反例。是的,这是一个特殊用途的设备,但是相对通用的代码在大多数其他方面都可以很容易地移植到它和从它移植出去,我看到在重组一个更大系统的架构或更换一个子系统时,会发生很多事情。当我们尝试为上述原型代码的变量a和b分配值130和-130时会发生什么情况?@Sailesh-当您尝试时会发生什么情况?用各种各样的值进行实验,看看你是否看到了这种模式。@Chris:最初我们会在编译时看到警告。输出将是O/P:a是-126--b是126,但我只是想和您一起检查值将如何分配/存储,以便在访问结果时。实际上,我关心的是当我们试图给变量赋值时,如何存储或赋值。严格地说,你错了
char
始终是1字节,但C标准没有规定一个字节必须是8位。所以你的数字——128到127并不正确(我从来没有见过CHAR_BIT!=8的平台,但是是的)。假设CHAR是8位类型最终是不安全的——某些TI DSP是一个相对较新的反例。是的,这是一个特殊用途的设备,但是相对通用的代码在大多数其他方面都可以很容易地移植到它和从它移植出去,我看到在重组一个更大系统的架构或更换一个子系统时,会发生很多事情。当我们尝试为上述原型代码的变量a和b分配值130和-130时会发生什么情况?@Sailesh-当您尝试时会发生什么情况?用各种各样的值进行实验,看看你是否看到了这种模式。@Chris:最初我们会在编译时看到警告。输出将是O/P:a是-126--b是126,但我只是想和您一起检查值将如何分配/存储,以便在访问结果时。实际上,我关心的是当我们试图给变量赋值时,如何存储或赋值。
#include<stdio.h>

int main()
{
    char a = 128;
    char b = -128;
    printf("a is %d -- b is %d \n",a,b);

    return 0;
}
a is -128 -- b is -128