设为首页 加入收藏

TOP

数据格式 int与char的存储方式
2014-07-19 22:52:46 来源: 作者: 【 】 浏览:93
Tags:数据 格式   int char 存储 方式
    有时候错误的代码会让我们更深刻的理解一门编程语言,所以在Learn c the hard way一书中,作者不停的让我们把正确的代码破坏掉,发挥我们的好奇心与想象力,去发觉c语言的一些特性。
    为了弄清弄清c中int与char型变量存储的异同和gcc对无'\0'字符数组的的反应,修改了Learn c the hard way书中的ex8
    代码如下
    #include <stdio.h>
    int main(int argc,char *argv[])
    {
    int areas[] = {10, 12, 13, 14, 20};
    char name [] = "Zed";
    char full_name[] = {
    'Z', 'e', 'd',
    ' ', 'A', '.', ' ',
    'S', 'h', 'a', 'w'
    };
    unsigned int interg ;
    interg[0] = '\0' * 0x01000000 + 'A'*0x00010000 + 'B' * 0x00000100 + 'C' * 0x00000001;
    unsigned int inter = interg[0];
    // WARNING: On some system you may have to change the
    // %ld in this code to a %u since it will use unsignt ints
    printf("The size of an int: %ld\n",sizeof(int));
    printf("The siez of areas (int[]):%ld\n",
    sizeof(areas));
    printf("The number of ints in areas: %ld\n",
    sizeof(areas)/sizeof(int));
    printf("The first area is %d, the 2nd %d.\n",
    areas[0],areas );
    printf("The size of a char: %ld\n",sizeof(char));
    printf("The size of name (char[]): %ld\n",
    sizeof(name)/sizeof(char));
    printf("The size of full_name (char[]): %ld\n",
    sizeof(full_name));
    printf("The number of chars: %ld\n",
    sizeof(full_name) / sizeof(char));
    // !!!其中full_name未设置null结尾
    printf("name=\"%s\" and full_name=\"%s\"\n",
    name, full_name);
    // test 证明了gcc把未初始化的地方初始为0
    printf("the char after the full_name(shuold be error):%c\n",full_name[12]);
    // 用 int 存储字符串
    printf("interg=%X\n", interg);
    printf("inter=\"%s\"\n", &inter);
    printf("interg=\"%s\"\n", interg);
    return 0;
    }
    重点在于
    char full_name[] = {
    'Z', 'e', 'd',
    ' ', 'A', '.', ' ',
    'S', 'h', 'a', 'w'
    };
    unsigned int interg ;
    interg[0] = '\0' * 0x01000000 + 'A'*0x00010000 + 'B' * 0x00000100 + 'C' * 0x00000001;
    unsigned int inter = interg[0];
    可以看到full_name字符串初始化的时候是没有null结尾的,如果的vc中编译并以字符串形式输出的话会跟上乱码
    interg的数组第一个元素中我分别在四个字节中放入了'\0'(即0)、'A'、'B'、'C',第二个元素未初始化。
    inter中放的是同样的数字。
    输出如下:
    The size of an int: 4
    The siez of areas (int[]):20
    The number of ints in areas: 5
    The first area is 10, the 2nd -1493946707.
    The size of a char: 1
    The size of name (char[]): 4
    The size of full_name (char[]): 11
    The number of chars: 11
    name="Zed" and full_name="Zed A. Shaw"
    the char after the full_name(shuold be error):
    interg=6EB11E70
    inter="CBA"
    interg="CBA"
    可以看到以字符串输出的full_name并没有因为无null结尾而输出乱码或错误,在csdn论坛上了解到可能是因为gcc将字符串存储区全部初始化为零。
    PS:对于数组的初始化,可以只初始化一个元素,就可以使其他元素为零(Learn c the hard way);
    inter以字符串输出的结果是按我赋值的倒序输出的,这个是因为小端的数据存储造成的。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言新建文件读出文件内容 下一篇C++构造函数:函数返回值

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)
·C语言指针的定义和使 (2025-12-26 05:21:31)
·在 Redis 中如何查看 (2025-12-26 03:19:03)
·Redis在实际应用中, (2025-12-26 03:19:01)