弄清size_t以及有符号数与无符号数的比较

一:size_t的具体概念

size_t一般在 sizeof()中出现,常用于内存分配,sizeof运算符以字节为单位返回其操作数的大小,而C规定sizeof返回size_t类型的值,这是一个无符号整数类型,一般也就是unsigned int。但它对应的字节大小跟操作系统有关,size_t的真实类型与操作系统有关:
在32位架构中被普遍定义为:
typedef unsigned int size_t;
而在64位架构中被定义为:
typedef unsigned long size_t;
size_t在32位架构上是4字节,在64位架构上是8字节,在不同架构上进行编译时需要注意这个问题。
像int这种类型无论在哪里都是4个字节,而size_t这么做增强了可移植性,里面具体的机理我还不明白,但想来与内存分配这一块有关,因为32位和64位与内存有关,8位对应一个字节,32位对应4个字节,64位对应8个字节。大概跟编译有什么联系,暂时还没这知识储备。
参考的博客: 点击打开链接
这个博客中写到了下面这个程序:
#include <stdio.h>
#include <string.h>
int main()
{
    int i = -1;
    if(i > strlen("Demon"))
        printf("Hello World");
    else
        printf("Hello Demon");
    return 0;
}
输出的竟然是Hello World!-1 > 5?!
这里面出错的原因是无符号整数和有符号整数直接的关系,i对应的int是有符号整型,而strlen返回的值是size_t,是unsigned int 无符号整型,无符号数和有符号数比较是比较容易出错的,所以我又搜索资料总结了一下:

二:有符号数和无符号数之间的比较

参考的博客: 点击打开链接
维基百科: 点击打开链接
16位有符号整数可表示-32768~32767之间的任意整数,而16位无符号整数可表示0~65535之间的数,那么如果一个有符号的数要转换成无符号的数,计算方法应该是当前值加上有符号数的最小值,例如:-1对应的16位的无符号整数为32767=-1+32768。
而C中无符号数的精度是大于有符号数的,所以两种同时出现时会把有符号数先转化为无符号数再进行运算,非常容易搞错,要十分注意。

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值