代码库使用数据类型,如uint8 [1字节宽无符号整数],uint16 [2字节宽无符号整数],uint32 [4字节宽无符号整数]等.
问题:uint8与char相同?uint16与int相同?uint32和long一样?uint64和double一样?
例如:uint8 c [20]; //那么sizeof(c)应该是20-不是吗?我在visual studio中编写了一个小代码,如下所示:
#include <stdio.h>
#include <string.h>
typedef unsigned int uint32;
typedef unsigned int uint8;
int main()
{
double a = 1320.134;
uint32 b;
uint8 c[20];
b = (unsigned int)a;
c[3] = b;
printf("value is %d", c[3]);
return 1;
}
Run Code Online (Sandbox Code Playgroud)
但是在调试模式下c的大小是50.为什么它显示那样?
Kei*_*son 17
uint8,uint16,uint32,和uint64可能是微软的具体类型.
作为1999标准的,C支持标准的typedef具有类似含义,定义<stdint.h>:uint8_t,uint16_t,uint32_t,和uint64_t.我将假设Microsoft特定类型的定义类似.Microsoft确实支持<stdint.h>,至少从Visual Studio 2010开始,但旧代码可能会使用uint8et al.
预定义类型char,short,int等人具有从一种C实施而变化的尺寸.C标准具有一定的最小要求(char是至少 8位,short和int是至少16,long至少为32,并在该列表中的每个类型是至少一样宽的前型),但允许有一定的灵活性.例如,我见过的系统int是16位,32位或64位.
char是几乎总是正好是8位,但它允许更宽.普通char可以是签名或未签名.
uint8_t必须是无符号整数类型,正好是8位宽.它可能是一个typedef unsigned char,虽然它可能是plain的typedef,char如果plain char碰巧是无符号的.如果没有预定义的8位无符号类型,则uint8_t根本不会定义.
类似地,每种uintN_t类型都是无符号类型,正好是N位宽.
此外,<stdint.h>定义对应签名intN_t的类型,以及int_fastN_t与int_leastN_t那些类型的至少指定的宽度.
的[u]intN_t类型被保证没有填充位,因此每个的大小正好N位.签名intN_t类型需要使用二进制补码表示.
虽然uint32_t可能是相同的unsigned int,例如,你不应该假设.unsigned int当需要至少16位宽的无符号整数类型时使用,这是当前系统的"自然"大小.uint32_t当您需要一个正好为32位宽的无符号整数类型时使用.
(并且不,uint64或者uint64_t不一样double; double是浮点类型.)
目前还不清楚您如何计算大小(“调试模式下的大小”?”)。
使用printf():
printf("the size of c is %u\n", (unsigned int) sizeof c);
Run Code Online (Sandbox Code Playgroud)
通常,您会使用 打印一个size_t值(即返回的类型sizeof)%zu,但如果您使用的是 Visual Studio 等 C99 之前的编译器,则它将无法工作。
您需要typedef在代码中找到定义自定义名称的语句,例如uint8等等;这些不是标准的,所以这里没有人知道它们是如何在您的代码中定义的。
新的 C 代码应该使用<stdint.h>它给你的uint8_t等等。
| 归档时间: |
|
| 查看次数: |
105543 次 |
| 最近记录: |