最多255个,我可以理解整数在char
和unsigned 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 作为输出。
猜测是否正确或有任何其他解释?
答案 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)
编译器是否会针对上述代码给出警告?您可能能够提高警告级别并查看某些内容。如果您指定一个无法静态确定的变量(执行前),它不会发出警告,但在这种情况下,很明显您要为变量的大小分配一些太大的东西。