int_size_is_32(),判断int是否为32位

本文探讨了如何不使用sizeof操作符来判断整型变量的位数,并提供了几种不同的实现方法,包括利用位运算和指针特性。

     题目来自深入理解计算机系统习题2.67,题目描述:编写一个函数int_size_is_32(),当在一个int为32位的机器上运行时,返回1,而其他情况返回0,不允许用sizeof操作符。

     首先进行的尝试:

int Is_Int_32() 
{
	int set_msb = 1 << 31;
	int beyond_msb = 1 << 32;
	return set_msb && !beyond_msb; 
}
   一般情况下运行良好,但是在SUN PARC这样的32位机器上运行时,过程返回为0.编译器提示如下:


 问:

A.这个代码在哪个方面没有遵守C语言标准

B 修改代码,使它在int至少为32位的任何机器上都能正确的运行

C 修改代码,使它在int至少为16位的任何机器上都能正确的运行


对于A,移位数量可能会大于等于字长,在这里,个人推测是SUN的那32位机器里,int是16位表示,所以会有警告超出

对于B,不用修改即可

对于C,可以修改如下:

int  Is_Int_32_2() 
{
	int i=1;
	int digit_count=1;
	while ((i=i<<16)>0)
		digit_count++;
	return digit_count==2 ? 1:0;
}
不用移位计算可以计算判断int是否32位也可以利用指针的特性,指向int的指针每次加1,增加的空间则为一个int的大小,示范代码如下:

int  Is_Int_32_1() 
{
	int i=1;
	return (int)(&i+1)-(int)(&i)==4 ? 1:0;
}
    如果要判断操作系统是否32位呢?则可以利用指针的另一个特点了:指针大小一般等于机器字长,采用二级指针,每次加1,则为一个指针的大小,示范代码如下:

int Is_OS_32()
{
	char *p="ab";
	char **q = &p;
	return (char)(q+1)-(char)(q)==4 ? 1:0;
}

     深入理解计算机系统还真是本好书,慢慢来吧
在C语言中,`int_least` 和 `int_fast` 是 `<stdint.h>` 头文件中定义的整数类型别名,它们的设计目的是为了在不同的平台上提供具有特定宽度的整数类型,以满足对性能或内存占用的特定需求。 ### `int_least` 类型 `int_leastN_t` 类型表示至少具有 `N` 宽度的最小整数类型。它优先考虑内存效率,确保使用尽可能少的内存来存储指定宽度的整数。例如,`int_least8_t` 表示至少为 8 的最小整数类型,通常在大多数平台上是 `signed char`。类似地,`int_least16_t` 是至少 16 的最小整数类型,通常是 `short` 或 `int`,具体取决于平台的实现 [^2]。 ### `int_fast` 类型 `int_fastN_t` 类型表示至少具有 `N` 宽度的最快整数类型。它优先考虑性能,选择在特定平台上能够最快处理的整数类型。例如,`int_fast8_t` 是至少 8 的最快整数类型,通常在大多数平台上是 `int`,因为 `int` 在许多架构中是默认的寄存器大小,处理速度较快。类似地,`int_fast16_t` 是至少 16 的最快整数类型,通常是 `int` 或 `long`,具体取决于平台的优化策略 [^2]。 ### 选择 `int_least` 还是 `int_fast` - **内存受限的场景**:如果需要最小的内存占用,例如在嵌入式系统中,应选择 `int_least` 类型。 - **高性能需求的场景**:如果需要更快的处理速度,例如在数值计算或实时系统中,应选择 `int_fast` 类型。 ### 示例代码 以下是一个简单的示例,展示了如何使用 `int_least` 和 `int_fast` 类型: ```c #include <stdio.h> #include <stdint.h> int main(void) { int_least8_t least8 = 127; // 至少 8 的最小整数类型 int_fast8_t fast8 = 127; // 至少 8 的最快整数类型 printf("Size of int_least8_t: %zu bytes\n", sizeof(least8)); printf("Size of int_fast8_t: %zu bytes\n", sizeof(fast8)); return 0; } ``` 输出可能如下(具体取决于平台): ``` Size of int_least8_t: 1 bytes Size of int_fast8_t: 4 bytes ``` ### 相关问题 - `int_least` 和 `int_fast` 类型如何影响程序的可移植性? - 在哪些情况下,`int_least` 和 `int_fast` 类型会指向相同的整数类型? - 如何确定特定平台上 `int_least` 和 `int_fast` 类型的实际大小?
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值