#include<stdio.h>
void main()
{
char b=-257;
printf("%u",b);
}
VC6下,结果4,294,967,295
-257
4字节的二进制表示
1111 1111 1111 1111 1111 1110 1111 1111
由于char只有1字节,所以只存储低八位的数据
也就是
1111 1111
然后你又要以无符号整型输出,由于最高位为1,char一般编译器是做signed char处理的,所以高位扩展的话,就是
1111 1111 1111 1111 1111 1111 1111 1111
32个1,对应的无符号数是4,294,967,295
但是如果代码改成
#include<stdio.h>
void main()
{
unsigned char b=-257;
printf("%u",b);
}
其结果就是255
为了让lz更好地理解,发个文章给lz,地址不能直接打在知道里,容易被HX,所以发到lz消息里了
-257
4字节的二进制表示
1111 1111 1111 1111 1111 1110 1111 1111
由于char只有1字节,所以只存储低八位的数据
也就是
1111 1111
然后你又要以无符号整型输出,由于最高位为1,char一般编译器是做signed char处理的,所以高位扩展的话,就是
1111 1111 1111 1111 1111 1111 1111 1111
32个1,对应的无符号数是4,294,967,295
但是如果代码改成
#include<stdio.h>
void main()
{
unsigned char b=-257;
printf("%u",b);
}
其结果就是255
为了让lz更好地理解,发个文章给lz,地址不能直接打在知道里,容易被HX,所以发到lz消息里了
温馨提示:答案为网友推荐,仅供参考
第1个回答 2011-11-19
LZ 知道char类型是一个字节,那么即由8位
一个char类型对应能存储的值范围是-128~127
而char b = -257;//这样赋值的结果溢出,输出为2^32次方值,即为默认的无符号占四个字节的int类型所能存储的最大值。其和编译器对齐有关系
一个char类型对应能存储的值范围是-128~127
而char b = -257;//这样赋值的结果溢出,输出为2^32次方值,即为默认的无符号占四个字节的int类型所能存储的最大值。其和编译器对齐有关系
第2个回答 2011-11-19
这个是因为C语言编译中的字节对齐。
(假设int为4字节,char为1字节)
struct X { int a; char b; int c; };
printf("%d,", sizeof(struct X));
struct Y { int a; char b; int c; char d};
printf("%d\n", sizeof(struct Y));
这个代码会输出什么?
a) 9,10
b)12, 12
c)12, 16
答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。
但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。
完整文章参阅我的百度空间。下面&追问
(假设int为4字节,char为1字节)
struct X { int a; char b; int c; };
printf("%d,", sizeof(struct X));
struct Y { int a; char b; int c; char d};
printf("%d\n", sizeof(struct Y));
这个代码会输出什么?
a) 9,10
b)12, 12
c)12, 16
答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。
但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。
完整文章参阅我的百度空间。下面&追问
话说这和我问的有关系吗?
追答因为单一的一个char类型值在内存中独占了一个int类型值的内存,当你转换成一个无符号整型输出时就把一个int大小的空间输出了。
追问那照这么说,-257应该是这么存的1111 1111 1111 1111 1111 1110 1111 1111也不是2^32-1啊
追答??
没有赋值的内存区域值是随机的,也就是前24(或者后24,前后我也没有搞清楚)位你不知道是多少,你可以做一个实验,在内存中声明一个int不赋值输出,或者用malloc()函数申请一个int型空间,他的值是随机的,不是2^32-1,也不是0
参考资料: