256如何存储在char变量和unsigned char中

时间:2014-02-03 14:50:17

标签: c++ c memory char bits

最多255个,我可以理解整数在charunsigned char中的存储方式;

#include<stdio.h>
int main()
{
        unsigned char a = 256;
        printf("%d\n",a);
        return(0);
}

在上面的代码中, unsigned char 以及 char 的输出 0

对于 256 我认为这是整数存储在代码中的方式(这只是猜测):

首先 256 转换为二进制表示, 100000000 (总共9位)。

然后他们删除了最左边的位(设置的位),因为char数据类型只有8位内存。

因此它以 00000000 的形式存储在内存中,这就是为什么打印 0 作为输出。

猜测是否正确或有任何其他解释?

3 个答案:

答案 0 :(得分:12)

你的猜测是正确的。转换为无符号类型使用模运算:如果值超出范围(太大或负),则减少模2 N ,其中N是目标类型中的位数。因此,如果(通常情况下)char有8位,则该值以256为模减少,因此256变为零。

请注意,没有此类规则可转换为签名类型 - 超出范围的值会提供实现定义的结果。另请注意,char未指定为正好8位,并且在较不主流的平台上可能更大。

答案 1 :(得分:1)

在您的平台上(以及任何其他“普通”平台)unsigned char为8位宽,因此它可以保存0到255之间的数字。

尝试为其分配256(这是一个int字面值)会导致无符号整数溢出,由标准定义导致“环绕”。 u = n的结果u是无符号整数类型而n是其范围之外的无符号整数u = n % (max_value_of_u +1)

这只是说出你已经说过的一种令人费解的方式:标准保证在这些情况下执行赋值只保留适合目标变量的位。这个规范是存在的,因为大多数平台已经在汇编语言级别实现了这一点(无符号整数溢出通常会导致此行为加上某种溢出标志设置为1)。

请注意,对于有符号整数,所有这些都不成立(通常为char}: signed 整数溢出是未定义的行为。

答案 2 :(得分:1)

是的,这是正确的。 8位可以保持0到255无符号,或-128到127有符号。在此之上,你已经遇到溢出的情况,比特将会丢失。

编译器是否会针对上述代码给出警告?您可能能够提高警告级别并查看某些内容。如果您指定一个无法静态确定的变量(执行前),它不会发出警告,但在这种情况下,很明显您要为变量的大小分配一些太大的东西。