在c中的unsigned short int中分配零

assign zero in unsigned short int in c

我尝试将零分配给名为列表的结构中的字段

list.ultimo = 0;

但是当我使用 printf

printf("%d", list.ultimo);

我得到结果

32766

但是当我添加

unsigned short int cero = 0;

printf的结果是正确的,不管那个不使用cero。为什么?

lista.h

#ifndef LISTA_H
#define LISTA_H

typedef struct{
  elemento lista[TAMANOMAX];
  unsigned short int ultimo;
}LISTA;

void Insertar(elemento, unsigned short int posicion, LISTA);
#endif

lista.c

#include<stdio.h>

typedef short int elemento;
#ifndef TAMANOMAX
#define TAMANOMAX 10
#endif
#include"lista.h"

void Insertar(elemento x, unsigned short int p, LISTA lista){
  if (lista.ultimo >= TAMANOMAX){
    puts("full list");
    printf("%hu",lista.ultimo); 
  }
}

main.c

#include<stdio.h>

typedef unsigned short int elemento;
#define TAMANOMAX 4
#include"lista.h"

int main(){
  LISTA esferas;
  esferas.ultimo = 0; 
  Insertar(2,0,esferas);
  printf("\n%hu\n", esferas.ultimo);
  return 0; 
}

结果是

$gcc -Wall lista.c main.c

full list

32765

0

我是新手,我现在很慢,很抱歉延迟

使用%hd打印short int,使用%hu打印unsigned short int%d 用于 int.

编辑:既然您已经发布了完整代码,TAMANOMAX 似乎在 lista.c 中设置为 10,但在 [=] 中设置为 4 20=],导致 main() 函数与 Insertar 函数不兼容。您应该在所有文件中具有相同的值。如果您想使用不同的数组长度,请在 LISTA 结构中添加一个 length 成员。但是 TAMANOMAX 绝对应该在任何地方都一样,否则你实际上使用的是不同的数据类型,你的程序将无法运行。

使用不匹配的格式说明符和参数类型调用 undefined behavior

引用 C11 标准,章节 §7.21.6.1,fprintf() 函数

[..] If any argument is not the correct type for the corresponding conversion specification, the behavior is undefined.

和关于 %d 格式说明符,

d,i
The int argument [....]

所以,%d 期望 int

根据您的问题标题,ultimounsigned short int 并且您正在使用 %d 打印该值。

您应该使用 %hu 来打印 unsigned short int